栈的基本概念:
定义
只允许在一端进行插入或删除操作的线性表。首先,栈是一种线性表,但限定这种线性表只能在某一段进行插入和删除操作。
栈顶(Top):线性表允许进行插入和删除的一端。
栈底(Bottom):固定的,不允许进行插入和删除的另一端。
空栈:不含任何元素。
栈的特点:
栈——先进后出、后进先出
入栈的概念:
入栈就是将一个新的元素放到栈顶,出栈就是从栈顶取出一个元素。
[ 入栈需要注意 栈是否为空 栈是否为满 ]
出栈的概念:
出栈指一种计算机术语,与其相对应的是进栈;进栈、出栈多是按照一定顺序的
出栈 需要注意 栈是否 不存在 ,和 栈是否 已空
栈的链式存储:
链表的头结点端做栈顶还是栈底?
答:栈顶 因为 链表 的头结点端 可以 更方便的进行元素 的 插入(头插法)和 删除(头结点做前驱)
-
栈链式存 结构体
//结点结构体 typedef struct Node{ int date; struct Node *next; }Node; //栈的结构体 typedef struct Stack{ struct Node header; int size; //栈的大小 即元素个数 }Stack,*LinkStack;
栈的顺序存储结构:
顺序栈的实现
采用顺序存储的栈称为顺序栈,它是利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶的位置。
栈的顺序存储类型可以用以下表示:
#define MAXSIZE 100 //栈中元素的最大个数
typedef struct {
ElemType data[MAXSIZE]; //存放栈中元素
int top; //栈顶指针
} SqStack;
栈顶指针:S.top,初始时设置S.top = -1;栈顶元素:S.data[S.top];
进栈操作:栈不满时,栈指针加1,再送值到栈顶元素
出栈操作:栈非空时,先去栈顶元素值,再将栈顶指针减1
栈空条件:S.top == -1
栈满条件:S.top == MAXSIZE - 1
栈长:S.top + 1
栈的应用
-
前 中 后 缀表达式如何计算?
首先运算优先级最高的,然后 将 运算符 放两个整体 之前 就是前缀 ,放两个整体之后,就是后缀!