C++——链式队列的综合应用

mac2024-11-24  30

链式队列的定义及基本操作

先定义队列的几个基本操作,再设计一主函数利用队列的操作完成以下功能: 键盘输入的字符可以临时存入键盘的缓冲区中。为了充分利用缓冲区的空间,往往将缓冲区设计成链式循环队列的结构,并为循环队列结构的缓冲区设置一个队首指针和一个队尾指针。 每输入一个字符到缓冲区中,就将尾指针后移,链入缓冲区的循环队列之中;每输出一个字符号,就将队头指针前移,将它从缓冲队列中删除。 假设有两个进程同时存在于一个应用程序中,第一个进程连续在屏幕上显示字符“X”,第二个进程不断检查键盘上是否有输入,若有则读入用户键入的字符,将其保存到键盘缓冲区中。 代码如下:

#include<iostream> #include<conio.h> using namespace std; typedef char ElemType; #define ERROR 0 #define OK 1 typedef struct QueueNode { ElemType data;//数据域 struct QueueNode *next;//指针域 }QueueNode, *QueueStr; typedef struct { QueueStr front;//头指针 QueueStr rear;//尾指针 }LinkQueue; LinkQueue InitQueue(LinkQueue &Q)//初始化 { Q.front = Q.rear = new QueueNode; Q.front->next = NULL; return Q; } int InQueue(LinkQueue &Q, ElemType e)//入队列 { QueueStr p; p = new QueueNode; p->data = e; p->next = NULL; cout << e; Q.rear->next = p; Q.rear = p; return OK; } int OutQueue(LinkQueue &Q, char e)//出队列 { if (Q.front == Q.rear) return 0; QueueStr p = Q.front->next; e = p->data; Q.front->next = p->next; if (Q.rear == p) Q.rear = Q.front; cout << e; delete p; return OK; } int GetHead(LinkQueue Q)//取队头元素 { if (Q.rear != Q.front) { return Q.front->next->data; } else return ERROR; } int main() { LinkQueue Q; InitQueue(Q); cout << "入队列(按Space结束):"; while (1) { if (_kbhit()) { int ch = _getch();//getch函数从conic.h头文件中获得,且注意返回值是int 而不是char if (ch == ' ') break;//当输入Space时结束 InQueue(Q, ch); } } cout << endl; char e=0; cout << "出队列:"; while (Q.front != Q.rear)//只要队列不为空,就出列 { OutQueue(Q, e); } cout << endl; system("pause"); }

需要了解关于getch()函数和kbhit()函数的使用方法,请参见: C++——kbhit()、getch()与getchar()

最新回复(0)