- 栈只能在顶端插入或删除元素,它的特点是先进后出。
- 应用领域:操作系统会为每个线程创建一个栈用来存储函数调用时的各个函数的参数、返回值及临时变量。
用两个栈实现队列(剑指offer---面试题7)
题目:用两个栈实现一个队列。队列的声明如下:请实现它的两个函数push和pop,分别完成入队和出队的功能;
1 template <typename T> class CQueue 2 { 3 public: 4 CQueue(void); 5 ~CQueue(void); 6 7 void push(const T& node); 8 T pop(); 9 10 private: 11 stack<T> stack1; 12 stack<T> stack2; 13 }
解题思路:
stack1始终作为入队的栈,stack2始终作为出队的栈;
(1)入队时,始终向stack1入栈;
(2)出队时,若stack2非空,则stack2直接出栈;
(3)出队时,若stack2为空,则将stack1的所有元素依次弹出并压入stack2,然后stack2出栈;
(4)出队时,若stack1和stack2都为空,则返回错误;
包含min函数的栈(剑指offer---面试题21)
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min、push和pop的时间复杂度都是O(1);
- m_data表示数据栈,m_min是辅助栈;
解题思路:
(1)push(value)时:m_data直接入栈,m_min的入栈元素是栈顶元素和value的较小值;
(2)pop()时:m_data和m_min都直接出栈;
(3)min()时:返回m_min的栈顶元素;
栈的压入、弹出序列(剑指offer---面试题22)
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出序列。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列;
- bool IsPopOrder(const int *pPush, const int *pPop, int nLength);
解题思路:
(1)构建辅助栈stack,遍历弹出序列pPop,若下一个弹出的数字==stack的栈顶元素则直接弹出;
(2)若弹出的数字!=stack的栈顶元素,则把压栈序列中还没有入栈的数字压入辅助栈stack,直到下一个弹出的数字==stack的栈顶元素;
(3)若所有的数字都压入栈了却仍然没有找到下一个弹出的数字,则返回失败;
按之字形顺序打印二叉树(剑指offer---面试题61)
详情见“树”专栏;