[剑指offer]09用两个栈实现队列插入和删除操作,C++实现

原创博文,转载请注明出处!

# 本文为牛客网《剑指offer》刷题笔记

1.题目

# 用两个栈实现队列的插入和删除操作

2.思路

        栈服从先入后出的原则处理数据,队列服从先入先出的原则处理数据。使用两个”先入后出“的栈实现的“先入先出”的队列。

        举例分析两个栈模拟队列插入和删除的过程:

  • 插入操作--元素a插入到stack1,此时stack1中的元素有{a},stack2为空。再压入b和c到stack1,此时stack1的元素有{a,b,c},其中c位于栈顶,而stack2仍然是空的。
  • 删除操作--按照先入先出的规则,由于a比b、c先插入队列中,最先删除的元素应该是a。元素a存储在stack1中,但并不在栈顶,因此不能直接进行删除操作。如果我们把stack1中的元素逐个弹出压入stack2,元素在stack2中的顺序正好和原来在stack1中的顺序相反。因此经过3次弹出stack1和要入stack2操作之后,stack1为空,而stack2中的元素是{c,b,a},这个时候就可以弹出stack2的栈顶a了。此时的stack1为空,而stack2的元素为{b,a},其中b在栈顶。当stack2中不为空时,在stack2中的栈顶元素是最先进入队列的元素,可以弹出。如果stack2为空时,我们把stack1中的元素逐个弹出并压入stack2。由于先进入队列的元素被压倒stack1的栈底,经过弹出和压入之后就处于stack2的栈顶,又可以直接弹出。如果有新元素d插入,我们直接把它压入stack1即可。

总结:用插入元素到栈stack1来模拟队列插入操作;用删除栈stack2的栈顶元素来模拟队列删除操作。

                                                                                剑指Offer(五):用两个栈实现队列

3.code

# 预备知识

    C++STL中的stack,成员函数top是返回栈顶元素,成员函数pop是删除栈顶元素。

  1 class Solution
  2 {
  3 public:
  4     // 两个栈模拟对列插入
  5     void push(int node) {
  6         stack1.push(node);
  7     }
  8     // 两个栈模拟对列删除
  9     int pop() {
 10 
 11         // stack2相关
 12         if(stack2.empty()){
 13             while(stack1.size()>0)
 14             {
 15                 int data = stack1.top();
 16                 stack2.push(data);
 17                 stack1.pop();
 18             }
 19         }
 20 
 21         int temp = stack2.top();
 22         stack2.pop();
 23         return temp;
 24     }
 25 
 26 private:
 27     stack<int> stack1;
 28     stack<int> stack2;
 29 };
View Code
原文地址:https://www.cnblogs.com/wanglei5205/p/8507212.html