栈和队列应用总结及特殊矩阵的压缩存储

文章目录

  • 一、栈在括号匹配中的作用
  • 二、栈在表达式求值中的应用
    • 1.将中缀表达式转变为后缀表达式(手算)
    • 2.将中缀表达式转变为前缀表达式(手算)
    • 3.将中缀表达式转后缀表达式(机算)
    • 4.中缀表达式的计算(用栈实现)
  • 三、栈在递归应用的问题
  • 四、队列在层次遍历中的应用
  • 五、队列在操作系统中的应用
  • 六、错题
  • 五、矩阵压缩问题(求压缩矩阵的数组下标)
    • 1.对称矩阵
      • 1.下三角按行存放
      • 2.下三角按列存放
      • 3.上三角按行存放
      • 4.上三角按列存放
    • 2.三对角矩阵
    • 3.稀疏矩阵


一、栈在括号匹配中的作用

遇到左括号压入栈中,遇到右括号出栈进行比较,如果相同则继续,不相同就匹配失败。同时,还会出现剩余右括号和左括号的现象,也是匹配失败的情况

bool 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); //入栈
        }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;
        }
    }
    return StackEmpty(S);
}






二、栈在表达式求值中的应用

1.将中缀表达式转变为后缀表达式(手算)

步骤:

  1. 确定中缀表达式各个运算符的顺序(采用左优先原则)
  2. 按照左操作数 右操作数 运算符 排列
    例:
    A + B *(C - D) - E / F
    3 2 1 5 4

A B C D - * + E F / -

用栈实现后缀表达式计算:
从左往右扫描元素,遇到操作数压入栈,遇到运算符则弹出两个栈顶元素,执行运算,将运算结果压回栈顶
注:先从栈里出来的运算数是右操作数

2.将中缀表达式转变为前缀表达式(手算)

步骤:

  1. 确定中缀表达式各个运算符的顺序(采用右优先原则)
  2. 按照 运算符 左操作数 右操作数 排列


用栈实现前缀表达式计算:
从右往左扫描元素,遇到操作数压入栈,遇到运算符则弹出两个栈顶元素,执行运算,将运算结果压回栈顶
注:先从栈里出来的运算数是左操作数

3.将中缀表达式转后缀表达式(机算)

  1. 遇到操作符,直接加入后缀表达式
  2. 遇到括号”(" (左括号)直接入栈,遇到右括号依次弹出站内运算符并加入后缀表达式,直到弹出左括号为止。
  3. 遇到运算符,先比较栈内有无优先级比它高或等于当前的运算符,有就弹出。遇到左括号就直接入栈。
    无括号
    有括号

4.中缀表达式的计算(用栈实现)

  1. 初始化两个栈,操作数栈 & 运算符栈
  2. 扫描到操作数,压入操作数栈
  3. 若扫描到运算符界限符,则按照中缀转后缀相同的逻辑压入运算符栈

三、栈在递归应用的问题

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

四、队列在层次遍历中的应用

  1. 数的层次遍历
  2. 图的广度优先遍历

五、队列在操作系统中的应用

FCFS(先来先服务)
数据缓冲区

六、错题

利用栈就表达式的值时,设立运算数栈OPEN。假设OPEN只有两个存储单元,则在下列表达式中,不会发生溢出的是(B)
A、A-B*(C-D)
B、(A-B)C-D
C、(A-B
C)-D
D、 (A-B)*(C-D)

分析栈长度,符号优先级及括号的作用
递归算法与非递归算法相比较,非递归算法通常效率高一些

五、矩阵压缩问题(求压缩矩阵的数组下标)

1.对称矩阵

1.下三角按行存放

2.下三角按列存放

3.上三角按行存放

4.上三角按列存放

2.三对角矩阵

按行展开 k = 2i + j - 3;
已知k求行列号
i = (k + 2 )/3 取上界 ,j = k - 2i + 3

3.稀疏矩阵

既可以采用数组存取,又可以采用十字链表法。

你可能感兴趣的:(笔记,数据结构,数据结构,算法)