其他分享
首页 > 其他分享> > 栈和队列的应用

栈和队列的应用

作者:互联网

栈和队列的应用

括号匹配(FIFO)

  1. 遇到左括号就入栈,遇到右括号就消耗一个左括号。
#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);
}

表达式求值

中缀表达式转后缀表达式

运算符在两个操作数后面。

左优先原则。左右符。

  1. 初始化一个栈,用于保存暂时不能确定运算顺序的运算符。

  2. 从左到右处理中缀表达式中各个元素 。遇到:

    ①操作数,直接加入后缀表达式

    ②界限符,左括号入栈,右括号依次弹出栈内运算符并加入后缀表达式,直到弹出左括号为止。

    ③运算符,依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,若碰到左括号或栈空则停止。之后再把当前运算符入栈。

中缀表达式转前缀表达式

运算符在两个操作数前面。

右优先原则。

函数调用

最后调用的函数最先执行结束。LIFO

函数调用时需要栈存储①调用返回地址②实参③局部变量。

递归

把一个大型的复杂问题转化成一个与原问题相似的规模较小的问题。

①可能导致栈溢出。②重复计算

树的层次遍历

图的广度优先遍历

操作系统中应用

先来先服务:多个进程争抢有限的系统资源(FirstComeFirstService)

打印数据缓冲区:缓解主机与打印机速度不匹配的问题。

矩阵的压缩存储

数组的定义

数组是由n个相同类型的数据元素构成的有限序列。每个元素受n个线性关系的约束。

数组是线性表的推广。

一维数组:线性表。

二维数组:元素为线性表。

除结构的初始化和销毁外,数组只会有存取元素和修改元素的操作。

数组的存储结构

特殊矩阵

压缩存储:多个值相同的元素只分配一个存储空间,对零元素不分配存储空间。

对称矩阵

策略:只存储主对角线+下三角区。

按行优先原则,将各元素存入一维数组中。

标签:数组,SqStack,队列,元素,运算符,括号,应用,表达式
来源: https://www.cnblogs.com/wangqr907/p/15732691.html