队列:队列是先进先出的原则
栈:栈是先进后出的原则
所以想要用栈实现队列是无法只用一个栈来实现的
解题思路:用两个栈
栈1用来push 栈2用来pop
假设进栈的数据是水 栈是杯子 这里的解题思路就相当于两个杯子在有顺序地互倒水
假设有数据 1 , 2 , 3 , 4顺序进栈stack1 希望得到的pop结果是 1 , 2 , 3 , 4 ;
第一步:stack1此时从下到上的数据是1,2,3,4
此时做一个操作(后续代码解释)将stack1的数据倒入stack2中
stack2此时从下到上的数据是4,3,2,1
这个时候pop出栈顶的数据''1'' 即为想要实现的队列应该pop出的数据
stack2此时从下到上的数据是4,3,2 stack1为空
第二步:这个时候再将stack2的数据倒入stack1中 重复第一步的操作 直至两个栈都为空
参考代码:
#include <stack>
#include <iostream>
using namespace std;
class stackQueue{
stack<int> m_sk1;
stack<int> m_sk2;
public:
stackQueue(){
}
void push(int x){
while (m_sk2.size() > 0) {
int data = m_sk2.top();
m_sk2.pop();
m_sk1.push(data);
}
m_sk1.push(x);
}
void pop(){
while (m_sk1.size() > 0){
int data = m_sk1.top();
m_sk1.pop();
m_sk2.push(data);
}
m_sk2.pop();
}
int peek(){ //获取队列头部数据
while (m_sk1.size() > 0) {
int data = m_sk1.top();
m_sk1.pop();
m_sk2.push(data);
}
return m_sk2.top();
}
bool empty() {
return m_sk1.size() && m_sk2.size();
}
};
int main() {
stackQueue sq;
sq.push(1);
sq.push(2);
sq.push(3);
sq.push(4);
cout << sq.peek() << endl;
sq.pop();
cout << sq.peek() << endl;
sq.pop();
cout << sq.peek() << endl;
sq.pop();
cout << sq.peek() << endl;
sq.pop();
system("pause");
return 0;
}