【死磕算法·栈与队列】如何用双栈实现队列操作?

题目要求:

编写一个类,只能用两个栈结构实现队列,支持队列的基本操作add(),poll(),peek()

题目思路:

栈是先进后出,队列是先进先出。用两个栈可以将顺序反过来,实现队列操作

设置两个栈stackPush(压入栈)和stackPop(弹出栈),一个只进行push操作,一个只进行pop操作。

将stackPush中的值都倒入到stackPop中,再从stackPop中弹出就是队列的操作了。

两个注意点:

1、从stackPush向stackPop中倒入数据时,必须将stackPush中的数据一次性全部倒完。(不然在stackPush栈底的元素(最先入栈的元素)到不了stackPop的栈顶,发生一次pop操作就会出错)

2、stackPop不为空时,不能往里面倒入数。(不然先入栈的数会在栈的底端不能按照队列性质尽快弹出)

从stackPush倒入stackPop中这个操作可以加入在add()或者poll()或者peek()中,只要不违反两个注意点即可。

代码实现:

class TwoStack {
public:
   stack<int>stackPush;stack<int>stackPop;//两个栈
   vector<int>result;
    void push(int value){
        stackPush.push(value);
    }
    void pop(){
             result.push_back(stackPop.top());
             stackPop.pop();
    }
    void trans(){
        while(!stackPush.empty()){
            stackPop.push(stackPush.top());
            stackPush.pop();
        }
    }
    vector<int> twoStack(vector<int> ope, int n) {
        // write code here
        for(int i = 0;i<n;i++){
            if(ope[i]!=0)
                push(ope[i]);
            if(ope[i]==0)//在pop之前,如果stackPop为空,把stackPush中的元素倒入stackPop中
            {
                if(stackPop.empty())
                    trans();
                pop();
            }
        }
        return result;
    }
};

猜你喜欢

转载自blog.csdn.net/gulaixiangjuejue/article/details/85037985