定义:限定只能在表的一端进行插入和删除运算的线性表。(栈顶、栈底、空栈)
原则:后进先出LIFO:最先插入的元素最后出栈。
基本运算:入栈、出栈、置栈空、判栈空、取栈顶元素。
栈的顺序存储结构
使用一维数组实现,int型top(栈顶指示器)指示实时栈顶位置,当栈空时,top= -1 。
![](https://i-blog.csdnimg.cn/blog_migrate/29d9bc4f112a22eb51db12cc99d018f5.jpeg)
//栈类的各函数定义
#include<iostream>
//定义一个char类型栈,顺序存储结构
class SeqStack
{
public:
SeqStack(int m=10); //**顺序存储结构需要指明一维数组的大小**
~SeqStack();
bool IsEmpty(){ return top == -1; }
bool IsFull(){ return top == Maxsize - 1; };
bool Push(const char &x);
bool Pop();
bool Top( char &x); //取栈顶元素到x
void ClearStack(){ top = -1; }
private:
int top;
int Maxsize; //栈最多存放元素个数
char* stack; //stack存放动态分配的一维数组首地址
};
SeqStack::SeqStack(int m)
{
stack = new char[m];
Maxsize = m;
top = -1;
}
bool SeqStack::Push(const char &x)
{
if (IsFull()) return false;
top++;
stack[top] = x;
return true;
}
bool SeqStack::Pop()
{
if (IsEmpty()) return false;
else{ top--; return true; }
}
bool SeqStack::Top( char &x)
{
if (IsEmpty()) return false;
else{
x=stack[top];
//top--;
return true;
}
}
链式存储结构的栈
在实际应用中,顺序栈所使用的一维数组的大小难以确定,而且存储利用率低。所以可以采用链式栈结构。
用不带头节点单链表表示链式栈,头指针取名为top,栈顶指针。当top为空时,栈为空。
![](https://i-blog.csdnimg.cn/blog_migrate/fc3aa4fd52b1c1402c4576b3b6dc2911.jpeg)
下面给出了字符型链式栈类及其结点类的定义。
//定义一个char类型栈,链式存储结构
class LinkedStack;
class Node
{
friend class LinkedStack;
private:
char data;
Node* next;
};
class LinkedStack
{
public:
LinkedStack(){ top = 0; }
~LinkedStack();
bool IsEmpty(){ return top == 0; }
//bool IsFull(){ return top == Maxsize - 1; };
void Push(const char &x);
bool Pop();
bool Top(char &x); //取栈顶元素到x
void ClearStack(){ top = 0; }
private:
Node* top;
};
LinkedStack::~LinkedStack()
{
ClearStack();
}
void LinkedStack::Push(const char &x)
{
Node* p = new Node;
p->data = x;
p->next = top;
top = p;
}
bool LinkedStack::Pop()
{
if (IsEmpty()) return false;
else{
Node* q = top;
top = top->next;
delete q;
return true;
}
}
bool LinkedStack::Top(char &x)
{
if (IsEmpty()) return false;
else{
x = top->data;
//top = top->next;
return true;
}
}