栈与队列面试题汇总
1.设计一个有GetMin功能的栈
思路1:用两个栈,一个用来实现栈的正常操作,称为主栈;另一个用来存储最小值,每当push遇到小于等于栈顶的值就压入,每当pop弹出与栈顶元素相等的值就弹出。
思路2:用两个栈,一个用来实现栈的正常操作,称为主栈;另一个用来存储最小值,每次push就压入,新值小于栈顶元素就压入新值,否则压入栈顶元素值,每次pop都弹出。
2.由两个栈组成队列
思路:用两个栈来实现,一个栈A,一个栈B,push操作每次压入栈A,每当栈B为空,pop操作把栈A的元素一次压入栈B,peek操作时,栈B不为空直接返回栈B栈顶,否则把栈A的元素一次压入栈B,再返回栈顶。
3.仅用一个递归函数和栈操作逆序一个栈
思路:每次移除栈底元素,递归不断把栈底元素提升到栈顶
1 #include <stack> 2 using namespace std; 3 int GetAndRemoveLastElem(stack<int>& s) 4 { 5 if (s.empty()) 6 throw ""; 7 int tmp = s.top(); 8 s.pop(); 9 if (s.empty()) 10 return tmp; 11 else 12 { 13 int ret = GetAndRemoveLastElem(s); 14 s.push(tmp); 15 return ret; 16 } 17 } 18 19 void Reverse(stack<int>& s) 20 { 21 if (s.empty()) 22 return; 23 int tmp = GetAndRemoveLastElem(s); 24 Reverse(s); 25 s.push(tmp); 26 }
PS:剩下的后面再整理。