原创博文,转载请注明出处!
# 本文为牛客网《剑指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的栈顶元素来模拟队列删除操作。
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 };