正如标题所述,你需要使用两个栈来实现队列的一些操作。
队列应支持push(element),pop() 和 top(),其中pop是弹出队列中的第一个(最前面的)元素。
pop和top方法都应该返回第一个元素的值。
样例
比如push(1), pop(), push(2), push(3), top(), pop(),你应该返回1,2和2
思路:实现上是一个栈作为压入栈,在压入数据时只往这个栈中压入,记为stack1;另一个栈作为弹出栈,在弹出数据时只从这个栈弹出,记为stack2。
需要注意两点:1.如果stack1要往stack2中压入数据,必须一次性把stack1中数据全部压入。
2.如果stack2不为空,stack1绝对不能向stack2中压入数据。
class MyQueue {
public:
stack<int> stack1;
stack<int> stack2;
MyQueue() {
// do intialization if necessary如果需要做初始化
}
void push(int element) {
stack1.push(element);
}
int pop() {
if(stack2.empty())
{
while(!stack1.empty()){
stack2.push(stack1.top());
stack1.pop();
}
}
int a=stack2.top();
stack2.pop();
return a;
}
int top() {
if(stack2.empty())
{
while(!stack1.empty()){
stack2.push(stack1.top());
stack1.pop();
}
}
return stack2.top();
}
};
编写一个类,只能用两个栈结构实现队列,支持队列的基本操作(push,pop)。
给定一个操作序列ope及它的长度n,其中元素为正数代表push操作,为0代表pop操作,保证操作序列合法且一定含pop操作,请返回pop的结果序列。
测试样例:
[1,2,3,0,4,0],6
返回:[1,2]
class TwoStack {
public:
vector<int> twoStack(vector<int> ope, int n) {
stack<int> StackPush; //push数据
stack<int> StackPop; //pop数据
vector<int> temp;
for(int i=0;i<n;i++){
if(ope[i]>0){ //元素为正数代表push操作
StackPush.push(ope[i]);
}else{
if(StackPop.empty())
{
while(!StackPush.empty()){
StackPop.push(StackPush.top());
StackPush.pop();
}
}
int a=StackPop.top();
temp.push_back(a);
StackPop.pop();
}
}
return temp;
}
};