队列基本操作
实验内容及要求:
编写程序,建立容量为n(建议n=8)的循环队列,完成以下程序功能。输入字符#,执行一次出队操作,屏幕上显示出队字符;输入字符@,队列中所有字符依次出队并按出队次序在屏幕上显示各字符;输入其它字符,则输入的字符入队。
要求采用队头/队尾间隔至少一个空闲元素的方法来实现循环队列;空队执行出队操作及队满执行入队操作需显示提示信息。
注意:反复输入字符时,需正确处理好回车键(即输入缓冲区的’\n’字符)的读取问题。
实验目的:掌握循环队列的基本操作算法。
代码
#include<iostream>
#include<conio.h>
using namespace std;
struct Queue
{
int* head;//队列头指针
int size;//循环队列大小
int f;//队头
int r;//队尾
};
void Initialize(Queue & eg,int size)
{
eg.head = new int[size];
eg.size = size;
eg.r = eg.f = -1;
}
int Enqueue(Queue& eg, char x)
{
if ((eg.r + 1) % eg.size == (eg.f + eg.size) % eg.size)
{
cout << "队列满" << endl;
return 0;
}
eg.r = (eg.r + 1) % eg.size;
eg.head[eg.r] = x;
return 1;
}
int Dlqueue(Queue& eg, char& x)
{
eg.f = (eg.f + 1) % eg.size;
x = (char)eg.head[eg.f];
return 1;
}
void Input(Queue& eg)
{
char x;
char c;
while (1)
{
switch (c=_getche())
{
case '#':
if (eg.r == eg.f)
{
cout << "队空,无法出队" << endl;
break;
}
Dlqueue(eg, x);
cout << x << " ";
break;
case '@':
if (eg.r == eg.f)
{
cout << "队空,无法出队" << endl;
}
while (!(eg.r == eg.f))
{
Dlqueue(eg, x);
cout << x << " ";
}
break;
default:Enqueue(eg, c); break;
}
}
}
int main(void)
{
Queue S;
Initialize(S, 8);
Input(S);
return 0;
}