数据结构(栈的补充五)

65 阅读4分钟

4、用栈模拟队列(需要两个栈,一般空间一样)

阶段性导入s2会出错,所以得到一个规则:在模拟的过程中如果要把元素导入栈,必须一次性的把所有的元素全部导入不然就会出错误。

假如某个时刻不停地入队得到这么一个状态也就是已经满了,想继续入队就要把另一个栈利用起来

总结:


5.括号匹配和计算

括号匹配问题

括号匹配问题这个相关考点主要是考查在编译器中的对于括号匹配检测技术的了解(意思就是给一段待编译代码,里面有可能涉及到很多括号,哪些括号出现的情况是匹配的?哪些是不匹配的?要能够检测出来)。如何能成功地把它检测出来?首先至少要知道什么样的是匹配的情况,什么样的是不匹配的情况。

如何检测括号是不是匹配呢?显然应该用到栈,并且整个流程可以简单的描述为从左至右扫描一个表达式,如果遇到 '(' 就入栈如果遇到 ')' 就出栈,假如这一个出栈操作不能成功(就是此时栈空),那就直接判断为括号不匹配,这就是不匹配的第二种情况,就是只有 ')' 而缺少 '(' ;如果可以出栈就检测刚才扫描到的那个括号和刚出栈的括号,如果两者恰好匹配则继续扫描,否则就直接判断为括号不匹配,这就是不匹配中的第三种情况;就这样一直进行下去,直到整个表达式都扫描完毕,如果此时栈中还有括号,说明表达式中的括号是不匹配的,这就是不匹配中的第一种情况缺少 ')' ;如果此时恰好栈空,那就证明整个表达式中的括号是匹配的。(判断时括号以外的内容可以忽略掉)

扫描过程中有一个很重要的步骤反复的出现过(比较当前选出的两个其中一个是出栈而得来的,另一个是当前扫描到的来判断一下是否匹配),这个操作需要几行代码来完成并且它是一个重复的过程,为了避免重复所以写操作定义的函数来完成

int isMatched(char left, char right) //判断括号是否匹配
{
    if (left == '(' && right ==')')
        return 1;
    else if (left == '[' && right == ']')
        return 1;
    else if (left == '{' && right == '}')
        return 1; 
    else
        return 0;
}


int isParenthesesBalanced(char exp[]) //括号匹配检测函数
{
    char s[maxSizel; int top = -1;
    for (int i = 0; exp[i] != '\0'; ++i) {
        if (exp[i] == '(' || exp[i] == '[' || exp[i] == '{')
            s[++top] = exp[i];
        if (exp[i] == ')' || exp[i] == ']' || exp[i] == '}'){
            if (top == -1)
                return 0;
            char left = s[top--];
            if (isMatched(left,exp[i]) == 0) 
                return 0;
        }
    }
    if (top> -1)
        return 0; 
    return 1;
}

利用栈所进行的一些计算问题

有一个以m为自变量的函数,当m=0的时候给一个函数的值,当m大于零的时候是一个递推式,这个推推式一般如下:用一个以m为自变量,f1为函数的系数,然后又出现了F函数嵌套了f2,同样以m为自变量,中间夹着一个运算符(多数就是加减乘除),f2函数会使得m的值变小。

其实根本用不到栈,只用把每次得到的因子累乘即可,那在这个过程中为什么要用栈呢?是因为这个函数的求解用递归函数来实现是最清晰明了的, 而递归函数其实就是用栈来实现的,这里就是用申请的栈来模拟递归函数内部那个栈的过程,因此有可能看到很多用栈来求解函数值的考题。用一个例子把这个函数具体化:

int calF(int m)
{
    int cum = 1;  //设为1才不影响累乘结果的正确性;若累加要设为0
    int s[maxSize],top = -1; 
    while (m != 0)//递归不断展开
    {
        s[++top] = m;//不断压入栈中
        m /= 3;	      //m = m/3;	
    }
    while (top != -1)
        cum *= s[top--]; 
    return cum;
}