基于两端操作的循环队列的实现(246)
描述
如果允许在循环队列的两端都可以进行插入和删除操作。构造一个循环队列,实现从队头入队,从队尾出队并输出。约定从队头入队时向下标小的方向发展,从队尾入队时则向下标大的方向发展。
输入
多组数据,每组数据有两行。第一行为一个整数n,n表示入队序列A的长度(n个数依次连续入队,中间没有出队的情况),第二行为序列A(空格分隔的n个整数)。当n等于0时,输入结束。
输出
对应每组数据输出一行。依次输出队列中所有的整数,每两个整数之间用空格分隔。
#include <iostream>
using namespace std;
#define Max 100 //宏定义
//定义带有tag的队列
typedef struct {
int *base;
int front; //队头
int rear; //队尾
}queue;
//初始化
void Initqueue(queue &q) {
q.base = new int[Max];
q.front = q.rear = 0; // 循环链表初始化即为两个索引都置为 0
}
//入队
void push(queue &q, int e) {
if (!((q.front - 1) % Max == q.rear)) { //队不满才入队
q.base[q.front] = e;
q.front = (q.front - 1) % Max;//***
}
}
//出队
void pop(queue &q) {
if (q.front != q.rear) { //队不空 才出队
cout << q.base[q.rear] << " ";
q.rear = (q.rear - 1) % Max;//***
}
}
//判kong【空:1 不空:0】
bool isempty(queue &q) {
if (q.front == q.rear )
return 1;
else
return 0;
}
int main() {
int n;
while (cin>>n&&n!=0)
{
queue q;
Initqueue(q);
for (int i = 0; i < n; i++) { //入队
int e;
cin >> e;
push(q, e);
}
int m = n - 1; //处理最后空格
while (m--) //出队
{
pop(q);
}
cout << q.base[q.rear]<<endl;
}
}