栈的说明
栈是一种基本的数据结构。在栈中,被删除的元素是最近被插入的元素,实现的是一种后进先出(last-in, first-out, LIFO)的策略。
改变栈中元素的操作方法只有两个——push与pop。push是把元素推入栈底,pop是把元素从栈顶弹出。
下面是push和pop的过程
图片来自《Data Structures and Program Design In C++》
数组实现
数组实现的思想很简单。利用一个变量count来记录栈顶,然后对数组进行操作。
图片来自《Data Structures and Program Design In C++》
template <class T>
class Stack {
private:
static const int maxstack = 10;
T entry[maxstack];
int count;
int stackSize;
bool full() const {
return stackSize == maxstack;
}
public:
Stack() : count(0), stackSize(0) {
for (int i = 0; i < maxstack; i++)
entry[i] = T();
}
void push(const T &val) {
if (!full()) {
entry[count] = val;
++count;
++stackSize;
}
}
void pop() {
if (!empty()) {
--count;
--stackSize;
}
}
T top() const {
if (!empty())
return entry[count - 1];
}
bool empty() const {
return stackSize == 0 && count == 0;
}
int size() const {
return stackSize;
}
};
链表实现
链表实现是以一个top_node作为链表的表头,标记栈顶,在此进行插入和删除操作
图片来自《Data Structures and Program Design In C++》
图片来自《Data Structures and Program Design In C++》
图片来自《Data Structures and Program Design In C++》
template <class T>
class Stack {
private:
// 声明结点的结构体
struct Node {
T data;
Node *next;
};
private:
Node *top_node;
int stackSize;
public:
Stack() : top_node(NULL), stackSize(0) { }
~Stack_List() {
while (!empty())
pop();
}
// push将新来的元素添加到链表头
void push(const T &val) {
Node *new_node = new Node;
new_node->data = val;
new_node->next = top_node;
top_node = new_node;
++stackSize;
}
// pop把链表头即栈顶的元素弹出
void pop() {
if (!empty()) {
Node *temp = top_node;
top_node = top_node->next;
delete temp;
--stackSize;
}
}
T top() const {
return top_node->data;
}
bool empty() const {
return stackSize == 0 && top_node == NULL;
}
int size() const {
return stackSize;
}
};
简单测试
#include <iostream>
using namespace std;
int main() {
Stack<int> s;
for (int i = 0; i < 11; i++)
s.push(i);
cout << s.size() << endl;
while (!s.empty()) {
cout << s.top() << " ";
s.pop();
}
cout << endl;
return 0;
}
数组实现的栈的测试结果
由于设定栈的最大容量为10,因此只有10个元素在栈内
链表实现的栈的测试结果
由于链表的长度是可增长的,因此能有11个元素在栈内
参考书籍
《Data Structures and Program Design In C++》