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 }