2020-06-05(实时记录)队列-用栈实现队列

就不引题了,大概和栈实现队列所用到的函数差不多。

思路:

同栈实现队列,只不过与上一个题目不同、这个的目的是将先push的元素先pop出去。

但是做的时候犯了一个错误,想的时候是:

先把第一个数5放进辅助栈里,然后把5转移到数据栈
5---NULL to NULL---5
再把第一个数5放进辅助栈,然后把4放进到辅助栈,
5---NULL to 4-5---NULL
再把第一、二个数放进数据栈里
放入顺序是5-4,然后发现数据栈里的排列是4-5的,那么pop的时候还是后进先出,没达到队列的效果
具体代码如下

void push(int x) {
        std::stack temp_stack;
        temp_stack.push(x);
        while(!data_stack.empty())
        {
            temp_stack.push(data_stack.top());
            data_stack.pop();
        }
        
        while(!temp_stack.empty())
        {
            data_stack.push(temp_stack.top());
            temp_stack.pop();
        }
    }

如果把以上栈和队列互换,则放入顺序同样是4-5,就是正确的push效果,详情见上一篇队列实现栈.
错误点在哪里呢?答案就是push进辅助栈的时机,如果画一个流程图执行完第一个循环后的辅助栈是倒叙(即后进的元素在栈顶)的,再执行一次第二个循环将辅助栈的元素全放进数据栈之后又是正序的了,白费了功夫。
所以进行修正如下

void push(int x) {
        std::stack temp_stack;
        while(!data_stack.empty())
        {
            temp_stack.push(data_stack.top());
            data_stack.pop();
        }
        temp_stack.push(x);
        while(!temp_stack.empty())
        {
            data_stack.push(temp_stack.top());
            temp_stack.pop();
        }
    }

第一个循环不执行
NULL-NULL
先把第一个数5放进辅助栈里,然后把5转移到数据栈
5---NULL to NULL---5
第一个循环做一次栈元素交换
NULL---5 to 5 ---NULL
然后把4放进到辅助栈,再把元素放进数据栈
4-5---NULL to 5-4---NULL
进栈顺序为5-4 出栈也为5-4
push更多元素可将栈内元素看成整体,其实就类似于两个数的操作
总之,将push操作放到这里,我的理解是能让push下面的一个循环执行完之后的对应栈为倒叙,就能输出正确结果了

你可能感兴趣的:(2020-06-05(实时记录)队列-用栈实现队列)