一.隊列
隊列是一種具有先進先出(FIFO)特性的線性數(shù)據(jù)結(jié)構(gòu),它只允許在隊列的兩端進行插入和刪除操作。隊列的一端稱為隊尾(rear),另一端稱為隊頭(front)。新元素總是插入在隊列的隊尾,而從隊列中刪除元素時則總是刪除隊頭元素。
由于隊列具有FIFO特性,因此隊列通常用于需要按照順序處理數(shù)據(jù)的場景,比如任務(wù)調(diào)度、消息傳遞等。隊列有兩種基本操作:入隊(enqueue)和出隊(dequeue)。當一個元素被插入到隊列的隊尾時,我們稱之為入隊操作;當一個元素被從隊列的隊頭刪除時,我們稱之為出隊操作。除了入隊和出隊操作以外,隊列還有其他一些常見的操作,例如獲取隊頭元素(peek)、判空(isEmpty)等。
二.題目要求
由于現(xiàn)實中的銀行排隊問題比較復(fù)雜,難以簡單實現(xiàn),博主這里主要是為了練習隊列的相關(guān)操作,所以這里簡單模擬一下即可。它應(yīng)該包含以下功能:
-
添加客戶:可以添加新的客戶到隊列中等待服務(wù)。
-
刪除客戶:當銀行柜員完成服務(wù)之后,需要將客戶從隊列中刪除。
-
顯示隊列:可以展示當前在隊列中等待服務(wù)的客戶列表。
三.順序隊列實現(xiàn)的原理
3.1原理
順序隊列是一種基于數(shù)組實現(xiàn)的隊列。其實現(xiàn)原理是使用一個固定大小的數(shù)組來存儲隊列中的元素,同時使用兩個變量front和rear分別表示隊頭和隊尾指針。
在順序隊列中,新元素入隊時,先檢查隊列是否已滿,如果已滿則無法入隊;否則將元素插入到rear指向的位置,并將rear指針后移一位。而出隊操作則是取出front指向的元素,并將front指針后移一位。
3.2注意
需要注意的是,順序隊列的主要缺點在于當隊列長度較大時,插入和刪除元素會導致整個隊列的元素向前移動,時間復(fù)雜度為O(n),因此對于頻繁插入和刪除元素的情況不適合使用順序隊列。
四.各部分功能及實現(xiàn)
1.定義結(jié)構(gòu)體
采用順序存儲結(jié)構(gòu)的隊列稱為順序隊
#define MaxSize 100
//定義號碼牌結(jié)構(gòu)表
typedef struct {
char name[20];
int num;
} Elemtype;
//定義循環(huán)順序隊列結(jié)構(gòu)體
typedef struct
{
Elemtype data[MaxSize]; //存放隊中元素
int front,rear; //隊頭和隊尾的偽指針
}SqQueue;
2.初始化隊列
構(gòu)造一個空隊列,將front和rear指針均設(shè)置為初始狀態(tài)。即-1。
//初始化隊列
void InitQueue(SqQueue *&q)
{
q=(SqQueue *)malloc(sizeof(SqQueue)); //申請一個順序隊大小的空隊列空間
q->front=q->rear=0; //隊頭和隊尾的偽指針均設(shè)置偽-1
}
3.隊列其他操作
銷毀隊列:釋放隊列q占用的存儲空間。
隊列判空:隊列為空,返回真;否則返回假。
//銷毀隊列
void DestroyQueue(SqQueue *&q)
{
free(q); //釋放q所占的空間即可
}
//判斷空隊列
bool QueueEmpty(SqQueue *q)
{
return (q->front==q->rear);
}
4.進隊
在隊列q不滿的情況下先將隊尾指針rear增1,然后將元素插入該位置。
//進隊列
bool enQueue(SqQueue *&q,Elemtype e)
{
if((q->rear+1)%MaxSize==q->front) //隊滿上溢出報錯
return false;
q->rear=(q->rear+1)%MaxSize; //隊尾增1
q->data[q->rear]=e; //rear位置插入元素e
return true;
}
5.出隊
在隊列不為空的條件下先將隊頭指針front增1,并將該位置的元素值賦給e。
//出隊列
bool deQueue(SqQueue *&q,Elemtype &e)
{
if(q->rear==q->front) //隊空下溢出報錯
return false;
q->front=(q->front+1)%MaxSize; //隊頭增1
e=q->data[q->front];
return true;
}
6.叫號程序
顯示當前隊列,核心算法
//叫號程序
bool displist(SqQueue *&q)
{
int i=q->front;
if(q->rear==q->front) //隊空下溢出報錯
return false;
printf("排隊叫號次序:\n");
while(i!=q->rear)
{
i++;
printf("%d\t%s\n",q->data[i].num,q->data[i].name);
}
printf("---------------- \n");
return true;
}
7.菜單實現(xiàn)
比較基礎(chǔ),重在整理
//菜單實現(xiàn)
void menu() {
printf(" 銀行叫號的應(yīng)用模擬:\n");
printf(" -------------------------------\n");
printf(" 1.建立(初始化)隊列\(zhòng)n");
printf(" 2.取號業(yè)務(wù)辦理\n");
printf(" 3.叫號業(yè)務(wù)辦理\n");
printf(" 4.查看排隊信息\n");
printf(" 5.下班,不進行業(yè)務(wù)辦理\n");
printf(" 6.退出程序!!!\n");
printf(" -------------------------------\n");
}
五.C語言實現(xiàn)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MaxSize 100
//定義號碼牌結(jié)構(gòu)表
typedef struct {
char name[20];
int num;
} Elemtype;
//定義循環(huán)順序隊列結(jié)構(gòu)體
typedef struct {
Elemtype data[MaxSize]; //存放隊中元素
int front, rear; //隊頭和隊尾的偽指針
} SqQueue, *Saquene; //順序隊類型
//初始化隊列
void InitQueue(Saquene *q) {
*q = (SqQueue *) malloc(sizeof(SqQueue)); //申請一個順序隊大小的空隊列空間
(*q)->front = (*q)->rear = 0; //隊頭和隊尾的偽指針均設(shè)置偽-1
}
//銷毀隊列
void DestroyQueue(Saquene q) {
free(q); //釋放q所占的空間即可
}
//判斷空隊列
int QueueEmpty(Saquene q) {
return (q->front == q->rear);
}
//進隊列
int enQueue(Saquene q, Elemtype *e) {
if ((q->rear + 1) % MaxSize == q->front) //隊滿上溢出報錯
return 0;
q->rear = (q->rear + 1) % MaxSize; //隊尾增1
q->data[q->rear] = *e; //rear位置插入元素e
return 1;
}
//出隊列
int deQueue(Saquene q, Elemtype *e) {
if (q->rear == q->front) //隊空下溢出報錯
return 0;
q->front = (q->front + 1) % MaxSize; //隊頭增1
*e = q->data[q->front];
return 1;
}
//叫號程序
int displist(Saquene q) {
int i = q->front;
if (q->rear == q->front) //隊空下溢出報錯
return 0;
printf("排隊叫號次序:\n");
while (i != q->rear) {
i++;
printf("%d\t%s\n", q->data[i].num, q->data[i].name);
}
printf("---------------- \n");
return 1;
}
//菜單實現(xiàn)
void menu() {
printf(" 銀行叫號的應(yīng)用模擬:\n");
printf(" -------------------------------\n");
printf(" 1.建立(初始化)隊列\(zhòng)n");
printf(" 2.取號業(yè)務(wù)辦理\n");
printf(" 3.叫號業(yè)務(wù)辦理\n");
printf(" 4.查看排隊信息\n");
printf(" 5.下班,不進行業(yè)務(wù)辦理\n");
printf(" 6.退出程序!??!\n");
printf(" -------------------------------\n");
}
//主程序
int main() {
int flag = 1, i, j;
int count = 4;
Elemtype e, pno;
Elemtype a[4] = {"張三", 1, "李四", 2, "王五", 3, "趙六", 4};
Saquene p;
menu();
while (flag == 1) {
printf("請選擇:\n");
scanf("%d", &i);
switch (i) {
case 1:
InitQueue(&p);
for (j = 0; j < 4; j++) {
e = a[j];
enQueue(p, &e);
}
break;
case 2:
count++;
printf("請輸入客戶姓名:\n");
scanf("%s", pno.name);
pno.num = count;
enQueue(p, &pno);
break;
case 3:
deQueue(p,&e);
printf("正在辦理業(yè)務(wù)的客戶為:%d\t%s\n",e.num,e.name);
break;
case 4:
displist(p);
printf("\n");
break;
case 5:
printf("下班,不進行業(yè)務(wù)辦理\n");
break;
case 6:
flag=0;
printf("退出程序");
break;
}
}
return 0;
}
六.運行結(jié)果
文章來源:http://www.zghlxwxcb.cn/news/detail-485916.html
歡迎收看博主其他系列的文章!文章來源地址http://www.zghlxwxcb.cn/news/detail-485916.html
到了這里,關(guān)于C語言模擬銀行排隊叫號(順序隊)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!