正如标题所述,你需要使用两个栈来实现队列的一些操作。
队列应支持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; } };