栈(stack ;a pile of things)
只能在一端插入删除;
“先进先出”“操作受限的线性表”
初始化(顺序存储):
int stack[MAXSIZE];
int top = -1;
入栈:stack[++top] = e;
出栈:stack[top–] =e;
栈空:top == -1;
栈满:top == MAXSIZE - 1;
链栈:
初始化:
LNode* head = (LNode*)malloc(sizeof(LNode));
head->next = NULL;
LNode* top = NULL;
入栈:
top = (LNode*)malloc(sizeof(LNode));//top始终指向新插入的节点;
top->next = NULL;
top->data = ‘A’;
top->next = head ->next;//头插法;
head->next = top;
出栈:
x = top->data;
head->next = top->next;
free(top);
top = head->next;
栈满:
考研中没有栈满;(内存无限大);
占空:
head->next == NULL;
队列(the queue)
定义:只能在一端插入,另一端删除;(先进先出的逻辑特性)
顺序队:
int queue[MAXSIZE];
int front=0, rear=0;
入队:
queue[++rear] = e;
出队:
x = queue[++front];(元素残留在队列中)
……假溢出;
环状队列
入队:rear = (rear+1)%MAXSIZE;
queue[rear]=x;
出队:front = (front+1)%MAXSIZE;
x = queue[front];
队空:
front = rear;
队满:
front = (rear+1)%MAXSIZE;
链队:
初始化:
入队:
出队:
考点(非代码)
考点1:由出栈序列判断栈容量;(选择题)
结论:若入:1,2, 3则无3,1,2;
卡特兰数(catalan number):
Cn = (2n)!/[(n+1)!n!] = 输出序列的个数(n为入栈元素个数)
考点2:表达式转换
中前后缀表达式:a+b/+ab/ab+
要会互相转换
二叉树转换法
括号转换法
考点3:栈用于求前中后缀表达式的值;
考点4:队列的配置问题
1:计算元素的个数
(rear-front+MAXSIZE)%MAXSIZE = NUM;
非正常配置问题
第一种:front指向第一个元素
rear指向最后一个元素的后一位;
1:计算个数公式一样,只是入队出队次序不同;
第二种:front指向第一个元素,rear指向最后一个元素;
队空:front = (rear+1)%MAXSIZE;
队满:front = (rear+2)%MAXSIZE;
计算元素个数
=(rear-front+1+maxsize)%maxsize;
考点4:队列扩展—双端队列
输入/输出受限的双端队列;考入队出队的次序问题;
考点5:栈的扩展
共享栈:共享同一块存储单元;
实现: int stack[maxsize];
int top1 = -1; top2 = maxsize;
(int top[2] = {-1, maxsize};)//将两个指针存在数组里
栈满:top[0] +1 == top[1];
用栈来模拟队列:(两个同大小的栈)
入队规则:
**若s1不空,则元素直接入s1;
**若s1满,s2空,则将元素一次性移入s2;之后在入s1;
出队规则:
**若s2不空,则从s2直接出栈;
**若s2空,则将s1元素入s2,然后在从s2出栈;
队满:s1满且s2不空 ;
对空;s1空且s2空;
考点2(代码部分)
利用栈求后缀表达式的值:从左向右扫描,遇到运算符就运算
栈求前缀表达式:从右向左扫描,遇到运算符就计算
中缀表达式转后缀表达式
中缀表达式转前缀表达式
括号匹配问题!
栈的计算