不管顺序栈还是链式栈遵循前进后出的规则。
顺序栈:
顺序栈是用顺序表(地址连续的存储空间)实现的栈存储结构。
栈的定义实现:
#define STACK_SIZE 20 // 默认栈大小
#define INF 32767
typedef int eleType ; // 栈存储元素类型
// 数组形式存储栈结构(先入后出)
class sqStack {
public:
sqStack(int size = STACK_SIZE) :elements(new eleType[size]), top(-1), maxSize(size) {}
bool Push(eleType ele); // 入栈
bool Pop(); // 出栈
eleType getTop(); // 获取栈顶元素
private:
eleType* elements; // 存储信息的顺序栈
int top; // 栈顶元素下标
int maxSize; // 栈最大元素个数
};
封装实现栈操作:
// 入栈
bool sqStack::Push(eleType ele) {
if (maxSize - 1 == top) { // 栈满
return false;
}
elements[++top] = ele;
return true;
}
// 出栈
bool sqStack::Pop() {
if (-1 == top) { // 栈空
return false;
}
--top;
return true;
}
// 获取栈顶元素
eleType sqStack::getTop() {
if (-1!= top) {
return elements[top];
}
return INF;
}
链式栈:
链式栈就是一种操作受限的单向链表,仅允许对栈顶元素(单向链表的表尾)进行操作。
采用模板类实现:
// 节点
template<class T>
class SNode {
public:
SNode() {}
SNode(T e) :elem(e), Next(NULL) {}
T elem;
SNode* Next;
};
// 链式栈
// 该栈结构为:
//
// 辅助头节点 top(栈顶) base(栈底)
// | | |
// Head-------------->ele1 --->ele2-->ele3-->......-->ele
template<class T>
class ListStack {
public:
bool Push(T elem); // 入栈
bool Pop(); // 出栈
T getTop(); // 获取栈顶元素
bool Is_empty(); // 判断栈是否为空
private:
SNode<T>* Head = new SNode<T>(); // 头节点不储存信息,仅辅助作用
};
基本操作:
入栈:
// 入栈
template<class T>
bool ListStack<T>::Push(T elem) {
SNode<T>* Temp = Head->Next;
// 根据 前进后出 采用头插法
Head->Next = new SNode<T>(elem);
if (Head->Next) { // 新分配内存成功
Head->Next->Next = Temp;
return true;
}
return false;
}
出栈:
// 出栈
template<class T>
bool ListStack<T>::Pop() {
if (NULL == Head->Next) {
return false;
}
Head->Next = Head->Next->Next;
return true;
}
获取栈顶元素:
// 获取栈顶元素
template<class T>
T ListStack<T>::getTop() {
if (NULL == Head->Next) {
// !--- 此处我也不知道返回啥值 --- !
return Head->elem;
}
return Head->Next->elem;
}
栈是否为空:
// 判断栈是否为空
template<class T>
bool ListStack<T>::Is_empty() {
if (NULL != Head->Next) {
return false;
}
return true;
}