栈
栈是一种先进后出(FILO,First-In-Last-Out)的线性表,栈和队列非常相像,但是栈只能在栈顶插入和删除元素。栈为空时不可以出栈。
在维护栈的时候,使用一个变量top_index来标记栈顶元素。在构造函数中把它初始化为-1。
当要向栈中插入元素时,只需要让栈顶标记后移一位,把新元素插入到相应的位置。
出栈时,先判断栈是否为空,如果不为空则使栈顶标记减一就可实现栈顶元素的出栈。
额外内容补充:
单调栈:
- 栈内元素从栈顶到栈底单调递增/递减;
- 单调栈的维护是O(n)级时间复杂度,因为每个元素只会进出栈各一次;
- 元素加入栈前,会在栈顶端把破坏栈单调性的元素都删除;
- 使用从栈顶到栈底单调递减的元素可以找到元素向左遍历的第一个比它小的元素(即离元素最近)。
实现栈的构造函数和析构函数:
1 template<typename Type> class Stack { 2 private: 3 Type * elements; 4 int max_size, top_index; 5 public: 6 explicit Stack(int input_size) { 7 max_size = input_size; 8 elements = new Type[max_size]; 9 top_index = -1; 10 } 11 ~Stack() { 12 delete[] elements; 13 }
实现栈的插入函数:
1 bool push(const Type &elem) { 2 if (top_index >= max_size - 1) { 3 return false; 4 } 5 top_index ++; 6 elements[top_index] = elem; 7 return true; 8 }
实现栈的删除栈顶元素操作:
1 bool pop() { 2 if (top_index < 0) { 3 return false; 4 } 5 top_index --; 6 return true; 7 }
实现栈的返回栈顶元素操作:
1 Type top() { 2 assert(top_index >= 0); 3 return elements[top_index]; 4 }
实现判断栈是否为空的函数:
1 bool empty() { 2 return top_index < 0; 3 } 4