栈
特点
栈(Stack)是一种线性存储结构
栈中的数据元素遵守“先进后出"(First In Last Out)的原则,简称FILO结构。
只能在栈顶进行插入和删除。
操作
- 入栈:把新元素压入栈顶
- 出栈:弹出栈顶元素
- 求栈的大小
- 获取栈顶元素
实现方式
- 用数组实现(有空间限制,但是代码简单)
- 用单链表实现
代码
用数组实现:
template<typename T>
class Stack {
public:
typedef T value_type;
typedef size_t size_type;
private:
T* data; // 栈中数据
size_type tt = -1; // 栈顶元素的下标
size_type cap; // 栈的容量
size_type ssize; // 栈的实际大小
// 为栈分配空间
void alloc(size_type sz) {
this->data = new value_type[sz];
this->cap = sz;
}
public:
// 构造函数
Stack(size_type capacity = 20) {
ssize = 0;
this->alloc(capacity);
}
// 入栈
bool push(value_type v) {
if (tt + 1 >= cap) return false; // 溢出
this->data[++tt] = v;
ssize++;
return true.
}
// 出栈
bool pop() {
if (tt < 0) return false; // 下溢
tt--;
ssize--;
return true;
}
// 获取栈顶
value_type top() {
return this->data[tt];
}
// 获取大小
size_type size() {
return ssize;
}
// 是否为空
bool empty() {
return tt < 0;
}
// 释放栈占用的空间
void free(){
delete [] data;
}
~Stack(){
free();
}
};
用链表实现:
template<typename T>
class LinkedStack {
public:
typedef T value_type;
typedef size_t size_type;
private:
struct Node {
value_type data;
Node* next;
};
Node* head, *p; // 记录头节点和当前点
size_type ssize;
public:
LinkedStack() {
head = NULL;
ssize = 0;
}
void push(value_type v) { //入栈
Node* q = new Node;
q->data = v;
if (head == NULL)
{
q->next = head;
head = q;
p = q;
}
else
{
q->next = p;
p = q;
}
ssize++;
}
void pop() { // 出栈
if (ssize) {
Node* q;
q = p;
p = p->next;
delete q;
ssize--;
}
}
size_type size() { // 栈大小
return ssize;
}
value_type top() { // 栈顶
return p->data;
}
bool empty() { // 是否为空
return ssize > 0;
}
};