栈和队列的应用
作者:互联网
栈和队列的应用
括号匹配(FIFO)
- 遇到左括号就入栈,遇到右括号就消耗一个左括号。
#define MaxSize 10
typedef struct{
char data[MaxSize];
//栈顶指针
int top;
}SqStack;
/*说明接口*/
//初始化栈
void InitStack(SqStack &S)
//判断栈是否为空
void StackEmpty(SqStack S)
//新元素入栈
bool Push(SqStack &S,char x)
//栈顶元素出栈,用x返回
bool Pop(SqStack &s,char &x)
void bracketCheck(char str[],int length){
SqStack S;
//初始化
InitStack(S);
for(int i=0;i<=length;i++){
if(str[i]=='('||str[i]=='['||str[i]=='{'){
push(S,str[i]);
}else{
if(StackEmpty(S))
return false;
char topElem;
Pop(S,topElem);
if(str[i]==')'&&topElem!=='(')
return false;
if(str[i]==']'&&topElem!=='[')
return false;
if(str[i]=='}'&&topElem!=='}')
return false;
}
}
StackEmpty(S);
}
表达式求值
中缀表达式转后缀表达式
运算符在两个操作数后面。
左优先原则。左右符。
-
初始化一个栈,用于保存暂时不能确定运算顺序的运算符。
-
从左到右处理中缀表达式中各个元素 。遇到:
①操作数,直接加入后缀表达式
②界限符,左括号入栈,右括号依次弹出栈内运算符并加入后缀表达式,直到弹出左括号为止。
③运算符,依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,若碰到左括号或栈空则停止。之后再把当前运算符入栈。
中缀表达式转前缀表达式
运算符在两个操作数前面。
右优先原则。
函数调用
最后调用的函数最先执行结束。LIFO
函数调用时需要栈存储①调用返回地址②实参③局部变量。
递归
把一个大型的复杂问题转化成一个与原问题相似的规模较小的问题。
①可能导致栈溢出。②重复计算
树的层次遍历
图的广度优先遍历
操作系统中应用
先来先服务:多个进程争抢有限的系统资源(FirstComeFirstService)
打印数据缓冲区:缓解主机与打印机速度不匹配的问题。
矩阵的压缩存储
数组的定义
数组是由n个相同类型的数据元素构成的有限序列。每个元素受n个线性关系的约束。
数组是线性表的推广。
一维数组:线性表。
二维数组:元素为线性表。
除结构的初始化和销毁外,数组只会有存取元素和修改元素的操作。
数组的存储结构
特殊矩阵
压缩存储:多个值相同的元素只分配一个存储空间,对零元素不分配存储空间。
对称矩阵
策略:只存储主对角线+下三角区。
按行优先原则,将各元素存入一维数组中。
标签:数组,SqStack,队列,元素,运算符,括号,应用,表达式 来源: https://www.cnblogs.com/wangqr907/p/15732691.html