BJFU 248基于两端操作的循环队列的实现(与246相区别 本质就是入队时操作稍作改变***)

基于两端操作的循环队列的实现(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;
		
	}
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值