数据结构--线性表

线性表

什么是栈

栈(stack)是限定仅在表尾进行插入和删除操作的线性表。

image-20220811213122332

LIFO(last in first out)结构

栈的顺序储存结构的实现

首先定义一个变量top来指示栈顶,top变量随着数据的入栈和出栈不断的变化。但是变化的范围需要在栈的长度范围之内

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct stack{
int data[MAXN];
int top;
}sqstack;

push(stack *s, int x){
if(s->top == MAXN - 1) return ERROR;
s->top++;
s->data[s->top] = x;
return OK;
}

pop(stack *s, int *x){
if(s->top == -1) return ERROR;
*x = s->data[s->top];
top--;
return OK;
}

两个栈共享空间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
struct stack{
int data[MAXN];
int top1;
int top2;
}sqstack;

push(stack *s, int x, int num){
if(s->top1 + 1 == s->top2) return ERROR;
if(num == 1){
s->data[++s->top1] = x;
}
else{
s->data[--s->top2] = x;
}
return OK;
}

pop(stack *s, int *x, int num){
if(num == 1){
if(s->top1 == -1) return ERROR;
*x = s->data[s->top1--];
}
else{
if(s->top2 == MAXN) return ERROR;
*x = s->data[s->top2++];
}
return OK;
}

栈的链式储存结构的实现

栈的应用

递归

操作系统在执行递归函数的时候,将每层递归函数的局部变量,参数值和返回地址压入栈,腾出寄存器进行下一层递归。在递归结束的退回阶段再将每层的结果出栈。

四则表达式求值

后缀(逆波兰)表示法定义

对于“9+(3-1)×3+10÷2”,用后缀表示法则变为:“9 3 1-3*+10 2/+”
即所有的符号都是在要运算数字的后面出现。

规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号,就将处于栈顶两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。

中缀表达式转后缀表达式

规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级不高于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。