①双栈大体思路
1.切入点
栈先进后出,队列先进先出。
两个栈,其中一个栈可以用于颠倒顺序。顺序就跟队列一样
2.明确双栈作用
1.第一个栈接收输入(输入栈)
2.第二个栈转换顺序(输出栈)
3.四个功能实现思路
Ⅰ.push
(输入栈)接收输入
Ⅱ.pop
弹出靠输出栈
具体操作:将输入栈内所有内容给到输出栈
(有个前提:输出栈必须为全空才允许这么操作)
假设直接利用输出栈进行转换。
输入1,2
输入栈:1,2
输出栈:2,1 (给输出栈后输入栈清空)
此时再添加一个3
则:输入栈:3
输出栈:2,1,3(顺序不对,应该让输出栈清空将2,1弹出。再往输出栈里添加元素)
Ⅲ.peek
栈顶元素,原理与pop差不多,看看代码即可体会区别
Ⅳ.empty
输入栈,输出栈都为空,队列就空(也挺好理解)
②代码实现
class MyQueue {
stack<int>input;//输入栈
stack<int>output;//输出栈
public:
MyQueue() {}
void push(int x) {
input.push(x);//接收输入
}
int pop() {
if(output.size()==0){
while(input.size()){
output.push(input.top());
input.pop();
}
}
int tmp=output.top();
output.pop();
return tmp;
}
int peek() {
if(output.size()==0){
while(input.size()){
output.push(input.top());
input.pop();
}
}
return output.top();
}
bool empty() {
return input.size()==0&&output.size()==0;
}
};