原题:https://pintia.cn/problem-sets/15/problems/837
用c++是为了使用stack类,能省去许多事。不过它没有自带的判断是否已满的函数,我这里给它加了一个isFull()用来判断是否已满。
两个堆栈实现队列思路是这样的:
入队就用s1来接收元素;
出队了使用s2弹出元素;重点在于,s2的元素是怎么来的
【只有当s2是空堆栈的时候,我们才能将s1的所有元素统统弹出压入s2】
由于本题给出了附加条件,判断是否已满;
这问题问得好,什么时候已满呢?是当S1满并且S2也满吗?
并不是的,而是当S1的容量与S2的容量相等/并且S2不为空的时候。
#include<iostream>
#include<stack>
using namespace std;
class Stack
{
public:
stack <int>s;
int capacity;
bool isFull()
{
if(s.size()==capacity)return true;
else return false;
}
};
Stack s1,s2;
//入队操作
void add(int x)
{
if(s1.s.size()<s2.capacity)
{
s1.s.push(x);
}
else if(s1.s.size()==s2.capacity&&s2.s.empty())
{
while(!s1.s.empty()&&!s2.isFull())
{
s2.s.push(s1.s.top());
s1.s.pop();
}
s1.s.push(x);
}
else
cout << "ERROR:Full" << endl;
return;
}
//出队
void delet()
{
if(s2.s.empty())//若是s2为空,将s1所有元素弹出压入s2
{
while(!s1.s.empty()&&!s2.isFull())
{
s2.s.push(s1.s.top());
s1.s.pop();
}
}
if(s2.s.empty())
{
cout << "ERROR:Empty" <<endl;
}
else
{
int x=s2.s.top();
s2.s.pop();
cout << x <<endl;
}
return;
}
int main()
{
int x;
char tip;
cin >> s1.capacity >> s2.capacity >> tip;
while(tip!='T')
{
switch(tip)
{
case 'A':
cin >> x;
add(x);
break;
case 'D':
delet();
break;
case 'T':
break;
}
cin >> tip;
}
return 0;
}