剑指offer: 面试7——用两个栈实现队列

剑指offer: 面试7——用两个栈实现队列

题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

思路:

栈1用来存放队列顺序的逆序,因此如果栈1不空2空则直接添加即可,输出时候倒过来自然是正常队列顺序,如果栈2不空,说明栈2中存的数可能是队列的正序,因此需要先借助栈1将顺序调成逆序再添加,且在此之前的栈1如果为空要顺带释放,防止内存泄漏。

添加时,分为几种情况

1)当两个栈都为空,直接在1中添加

2)1不空,2空,直接在1中添加

3)2不空1空,释放1,然后2添加到1,在1中添加节点

删除时类似,同时要判断两个栈是否为空,如果为空则错误

删除不同于添加,要从队头删,因此需要先将栈1中存放的队列逆序在2中变为正序,之后再在2栈顶删节点。

删除:

1)1不空2空,把1添加到2中,删除2栈顶

2)2不空,1空,直接删2栈顶

3)两个都不空,先删除2所有节点,把1赋到2中,再删除2栈顶

class Solution
{
public:
    void push(int node) {
        if(stack2.empty())
            stack1.push(node);
        else
        {
            while (!stack1.empty()) 
                stack1.pop();
            while(!stack2.empty())
            {
                int n=stack2.top();
                stack2.pop();
                stack1.push(n);
            }
            stack1.push(node);
        }
        }

    int pop() {
        if(stack1.empty()&&stack2.empty())return -1;
            if(!stack2.empty())
            {
                while(!stack1.empty())
                    stack1.pop();
            }
            else
            {
                while(!stack1.empty())
                {
                    int i=stack1.top();
                    stack1.pop();
                    stack2.push(i);
                }
            }
                int j=stack2.top();
                stack2.pop();
                  return  j;
        }

private:
    stack<int> stack1;
    stack<int> stack2;
};

猜你喜欢

转载自blog.csdn.net/MereX/article/details/89382607