考试前复习下数据结构,把一些知识点整理在这!主要参考了殷人昆主编的《数据结构(用面向对象方法与C++语言描述)》这本书,以及中山大学刘聪老师的课件内容!
概念与性质
一些概念
栈是只允许在表的末端进行插入和删除的线性表。
- 栈顶:允许插入和删除的一端
- 栈底:不允许插入和删除的一端
- 空栈:栈中没有任何元素的栈
栈的性质
由于栈是一种运算受限的线性表,只允许在表的一端进行插入删除,所以栈具有一些特殊的性质。给定栈S=(a1, a2, …, an),则最后加入栈的元素an为栈顶,按a1, a2, …, an的顺序进栈,出栈的顺序则刚好相反,即an先出栈,a1最后出栈。这样的性质可以概括为先进后出(FILO),或者叫后进先出(LIFO),两种说法都可以,但是我比较习惯FILO。
栈的操作
栈有几个主要的操作:
- 建立一个空栈(构造函数Stack());
- 在栈顶添加一个新元素,如果栈未满(push() );
- 在栈顶删除一个元素,如果栈不空(pop() );
- 检查栈是否空(isEmpty());
- 取得栈顶元素,如果栈不空(Top())。
栈的抽象数据类型主要有两种存储表示:基于数组的存储表示(顺序栈)和基于链表的存储表示(链式栈)。
顺序栈
基于数组的存储表示实现的栈称为顺序栈。
数组实现
template <typename T>
class Stack {
private:
const static int MAX_ELEMENT_COUNT = 1000;
int elementCount;
T elements[MAX_ELEMENT_COUNT];
public:
Stack() : elementCount(0) {}
bool isFull() {
return elementCount >= MAX_ELEMENT_COUNT;
}
bool isEmpty() {
return elementCount == 0;
}
void push(T element) {
if (isFull()) {
cout << "The stack is full. Can not push any element now." << endl;
return;
}
elements[elementCount] = element;
elementCount++;
}
void pop() {
if (isEmpty()) {
cout << "The stack is empty. Can not pop any element now." << endl;
return;
}
elementCount--;
}
T top() {
if (isEmpty()) {
throw runtime_error("No data in stack.");
}
return elements[elementCount-1];
}
};
vector实现
template <typename T>
class Stack {
private:
vector<T> elements;
public:
Stack() {}
bool isEmpty() {
return elements.size() == 0;
}
void push(T element) {
elements.push_back(element);
}
void pop() {
if (isEmpty()) {
cout << "The stack is empty. Can not pop any element now." << endl;
return;
}
elements.pop_back();
}
T top() {
if (isEmpty()) {
throw runtime_error("No data in stack.");
}
return elements[elements.size() - 1];
}
};
链式栈
基于链表的存储表示实现的栈称为链式栈。
template <typename T>
class Stack {
private:
LinkedList<T> elements;
public:
Stack() {}
bool isEmpty() {
return elements.isEmpty();
}
void push(T element) {
elements.addFirst(element);
}
void pop() {
if (isEmpty()) {
cout << "The stack is empty. Can not pop any element now." << endl;
return;
}
elements.removeFirst();
}
T top() {
if (isEmpty()) {
throw runtime_error("No data in stack.");
}
return elements.getFirst();
}
};
注:模板类LinkedList的实现在上一篇博客《数据结构学习——线性表》中,查看上一篇博客