行百里者半九十 ——栈与队列

剑指 Offer 09. 用两个栈实现队列

剑指 Offer 30. 包含 min 函数的栈

1、 用两个栈实现队列

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

解:

栈的特性是先进后出,而队列是先进先出,队列的插入操作最简单,直接插入栈A即可,队列的删除操作,即出队列,就需要将栈A中的元素出栈,再压入到栈B,再对栈B出栈,如此出队的顺序才满足先入先出。

 1 #include <iostream>
 2 #include <stack>
 3 
 4 using namespace std;
 5 
 6 //用两个栈实现队列
 7 class CQueue{
 8 public:
 9     CQueue(){
10     }
11 
12     //入队 - 在队尾插入整数
13     void appendTail(int value) {
14         mStack1.push(value);
15     }
16 
17     //出队 - 在队首删除整数并返回
18     //先判断栈2是否不为空,栈2不为空,肯定是先将栈2出栈,栈2尾的元素肯定是最先进入的
19     //再判断栈1(执行到此栈2必空),栈1为空,就返回-1,否则栈1元素压入栈2,再将栈2尾元素出栈
20     int deleteHead() {
21         if(!mStack2.empty()){
22             int tmp = mStack2.top();
23             mStack2.pop();
24             return tmp;;
25         }
26         if(mStack1.empty()) return -1;
27 
28         while(!mStack1.empty()){
29             int tmp = mStack1.top();
30             mStack2.push(tmp);
31             mStack1.pop();
32         }
33         int tmp = mStack2.top();
34         mStack2.pop();
35         return tmp;;
36     }
37 private:
38     stack<int> mStack1;
39     stack<int> mStack2;
40 };
41 
42 int main()
43 {
44     cout << "Two Stack Make a Queue" << endl;
45     CQueue queue;
46     queue.appendTail(1);
47     queue.appendTail(2);
48     queue.appendTail(3);
49     cout << queue.deleteHead() << endl;
50     queue.appendTail(5);
51     cout << queue.deleteHead() << endl;
52     cout << queue.deleteHead() << endl;
53     cout << queue.deleteHead() << endl;
54 
55     return 0;
56 }

2、包含 min 函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

解题思路:
如何在时间复杂度为O(1)的情况下获取栈A中最小元素,可以借助一个辅助栈B。在每次push入栈时,和栈顶的元素比较。
如果压入的元素比栈顶元素小(包括等于),则同时压入栈A、B,如果压入的元素比栈顶元素大,则只压入栈A。栈A保存所有元素,则栈B中保存A中的非严格降序的子序列。
还有一点,在调用pop函数对A出栈时,也要同时更新栈B的元素,保持降序子序列与A同步。

 1 #include <iostream>
 2 #include <stack>
 3 
 4 using namespace std;
 5 
 6 class MinStack{
 7 public:
 8     MinStack() {}
 9 
10     void push(int x) {
11         mStack1.push(x);
12         if(mStack2.empty() || x < mStack2.top())
13             mStack2.push(x);
14     }
15 
16     void pop() {
17         if(mStack1.top() == mStack2.top())
18             mStack2.pop();
19         mStack1.pop();  //栈1和栈2要等比较完之后才能出栈
20     }
21 
22     int top() {
23         return mStack1.top();
24     }
25 
26     int min() {
27         return mStack2.top();
28     }
29 private:
30     stack<int> mStack1;
31     stack<int> mStack2;
32 };
33 
34 int main()
35 {
36     cout << "Min Stack!" << endl;
37     MinStack* minStack = new MinStack();
38 
39     minStack->push(0);
40     minStack->push(1);
41     minStack->push(0);
42     cout << minStack->min() << endl;
43     minStack->pop();
44     cout << minStack->top() << endl;
45     cout << minStack->min() << endl;
46 
47     return 0;
48 }
原文地址:https://www.cnblogs.com/y4247464/p/15551951.html