3-8 堆栈模拟队列 (25 分)

设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q。

所谓用堆栈模拟队列,实际上就是通过调用堆栈的下列操作函数:

int IsFull(Stack S) :判断堆栈S是否已满,返回1或0;
int IsEmpty (Stack S ):判断堆栈S是否为空,返回1或0;
void Push(Stack S, ElementType item ) :将元素item压入堆栈S;
ElementType Pop(Stack S ) :删除并返回S的栈顶元素。
实现队列的操作,即入队void AddQ(ElementType item)和出队ElementType DeleteQ()。

输入格式:
输入首先给出两个正整数N1和N2,表示堆栈S1和S2的最大容量。随后给出一系列的队列操作:A item表示将item入列(这里假设item为整型数字);D表示出队操作;T表示输入结束。

输出格式:
对输入中的每个D操作,输出相应出队的数字,或者错误信息ERROR:Empty。如果入队操作无法执行,也需要输出ERROR:Full。每个输出占1行。

在这里插入图片描述

在这里插入图片描述

题目思路:
1.不用真的去实现题目中说的那么多函数的功能,可以采用两个整形数组模拟一下即可。
2.想要达到队列先进先出的效果,那么一定是让数据在入栈以后,在另一个栈中“翻个身”,也就是说让小的栈作为输入栈,大的栈作为输出栈(因为小的栈够短,能够在大的栈中“翻身”)。
3.队空条件,两个栈(数组)都为空。
4.栈满条件,输入栈满了并且输出栈里还有元素。(自己在纸上画画,在这种条件下,如果进行“翻身”动作,那么原本在输出栈准备输出的元素就被压到下面了,不符合队列的规则)

#include<iostream>
using namespace std;
void swap(int& a, int& b){
    
    	int t = a;	a = b;	b = t;}

int main()
{
    
    
	int m, n, x;
	int st1[100], st2[100], k1 = 0, k2 = 0;
	cin >> m >> n;
	if(m < n) swap(m, n);	//把小栈大小定位n,方便统一处理
					
	char c;
	while (cin >> c && c != 'T')
	{
    
    
		if (c == 'A')
		{
    
    
			cin >> x;
			if (k2 == n && k1)	//栈满
				cout << "ERROR:Full\n";
			else if (k2 < n)
				st2[k2++] = x;
			else if (k2 == n && !k1)
			{
    
    
				while (k2)//翻身
				{
    
    
					st1[k1++] = st2[--k2];
				}
				st2[k2++] = x;	//翻身以后再输入
			}
			else
				cout << "ERROR:Full\n";
 
		}
		else if (c == 'D')
		{
    
    
			if (!k1 && !k2)//栈空
				cout << "ERROR:Empty\n";
			else if (k1)
				cout << st1[--k1] << endl;
			else if (!k1 && k2)	
			{
    
    
				while (k2)		//翻身
				{
    
    
					st1[k1++] = st2[--k2];
				}
				cout << st1[--k1] << endl;//翻身以后再输出
			}
		}
	}
    
	return 0;
}

猜你喜欢

转载自blog.csdn.net/xdg15294969271/article/details/113894078