栈的应用:表达式求值运算

http://blog.csdn.net/wenzhou1219/article/details/23961307

#include <iostream>
#include <cstdio>
#include <stack>
#include <cstring>
#include <stdlib.h>
using namespace std;

#define LEVEL_invalid -1
#define LEVEL_same 0
#define LEVEL_smaller 1
#define LEVEL_bigger 2
stack <char> ops,mid_ops;
stack <double> vals,mid;
double m,n;
char operator_level_1[10] = {‘#‘, ‘(‘, ‘+‘, ‘-‘, ‘*‘, ‘/‘, ‘)‘};
char operator_level_2[10] = {‘#‘, ‘)‘, ‘-‘, ‘+‘, ‘/‘, ‘*‘, ‘(‘};

int compare_operator(char op1, char op2){
    int level1_index1 = -1,level1_index2 = -1;
    int level2_index1 = -1,level2_index2 = -1;
    if((op1 == ‘)‘ && op2 == ‘(‘) || (op1 == ‘#‘ && op2 == ‘)‘) || (op1 == ‘(‘ && op2 == ‘#‘))///)和(, #和),(和#都是不能配对的,不合法;
        return LEVEL_invalid;
    if((op1 == ‘(‘ && op2 == ‘)‘) || (op1 == ‘#‘ && op2 == ‘#‘))
        return LEVEL_same;

    while(operator_level_1[++level1_index1] != op1); ///op1 在 level_1中的位置大小;
    while(operator_level_1[++level1_index2] != op2); ///op2 在 level_1中的位置大小;
    while(operator_level_2[++level2_index1] != op1); ///op1 在 level_2中的位置大小;
    while(operator_level_2[++level2_index2] != op2); ///op2 在 level_2中的位置大小;

    ///1.判断两个操作符的优先级关系
    ///2.‘#‘ < ‘+‘, ‘-‘ < ‘*‘, ‘/‘
    ///3.两个相同的运算符或同级别的运算符(‘+‘和‘-‘,‘*‘和‘/‘)
    ///对比时应判定为前一个运算符优先级别高,这样才能保证连续
    ///两个相同的运算符或同级别的运算符出现时前一个运算符出栈
    ///完成一次计算
    if((level1_index1 - level1_index2 <0 && level2_index1 - level2_index2 <0)||op1 == ‘(‘ || op2 == ‘(‘)
        return LEVEL_smaller;
    else
        return LEVEL_bigger;
}

void cal_operator(char op2){
    char op1 = ops.top();
    int result = compare_operator(op1, op2);
    if(result == LEVEL_smaller)
        ops.push(op2);
    else if(result == LEVEL_same)
        ops.pop();
    else if(result == LEVEL_bigger){
        char s = ops.top();ops.pop();
        double n,m;
        m = vals.top();vals.pop();
        n = vals.top();vals.pop();
        if(s == ‘*‘) vals.push(n * m);
        else if(s == ‘+‘) vals.push(n + m);
        else if(s == ‘/‘) vals.push(n / m);
        else if(s == ‘-‘) vals.push(n - m);
        if((op2 == ‘)‘ && ops.top() == ‘(‘) || (op2 == ‘#‘ && ops.top() == ‘#‘))
            ops.pop();
        else
            ops.push(op2);
    }
}

int main(){
    //freopen("in.txt","r",stdin);
    char x;
    ops.push(‘#‘);
    while((x = getchar()) != EOF){
        //cout<<x;
        if(((x > ‘9‘)||(x < ‘0‘)) && !mid.empty()) {
            vals.push(mid.top());
            while(!mid.empty())
                mid.pop();
        }
        else if(x >= ‘0‘ && x <= ‘9‘) {
            if(mid.empty()) {n = x - ‘0‘;mid.push(n);}
            else if(!mid.empty()){
                m = mid.top();
                n = m*10 + x - ‘0‘;
                mid.pop();
                mid.push(n);
            }
        }
        if(x == ‘\n‘) {
            ops.push(‘#‘);
            while (!ops.empty()){
                char s = ops.top();ops.pop();
                cal_operator(s);
            }
            break;
        }
        if(x > ‘9‘ || x < ‘0‘)
            cal_operator(x);
    }
    return 0;
}
时间: 2024-11-10 08:22:21

栈的应用:表达式求值运算的相关文章

栈应用二(表达式求值)

问题;设计一个程序,演示用算符优先法对算术表达式求值的过程.利用算符优先关系,实现对算术四则混合运算表达式的求值.(1)输入的形式:表达式,例如3+2*6-4     包含的运算符只能有'+' .'-' .'*' .'/'(目前还不兼容括号) :(2)输出的形式:运算结果,例如3+2*6-4=11: (3)程序所能达到的功能:对表达式求值并输出:示例:①3+2*6-4 ②30+20*6-80 ③2*7-3*5-3 思路:1.程序扫描表达式,一个一个的扫描2.当发现这个字符是数字的时候,直接入数栈

数据结构 栈的应用 --表达式求值

一: 中缀表达式求值  思想: 需要2个栈,运算对象栈OPND,运算符栈OPTR, 1:将栈OPND初始化为空,栈OPTR初始化为表达式的定界符# 2:扫描表达式,直到遇到结束符# 2.1:当前字符是运算对象,入栈OPND 2.2:当前字符是运算符且优先级比栈OPTR的栈顶运算符优先级高,入栈OPTR,处理下一个字符 2.3:当前字符是运算符且优先级比栈OPTR的栈顶运算符优先级低,则从栈OPND出栈2个运算对象,从栈OPTR出栈一个运算符进行运算,并将运算结果入栈OPND,处理当前字符 2.4

栈的应用——表达式求值

表达式求值是程序设计语言编译中的一个基本问题,它的实现就是对“栈”的典型应用.本文针对表达式求值使用的是最简单直观的算法“算符优先法”. 本文给出两种方式来实现表达式求值,方式一直接利用中缀表达式求值,需要用到两个栈,操作数栈和操作符栈.首先置操作数栈为空栈, 操作符栈仅有“#”一个元素.依次读入表达式中的每个字符,若是操作数则进操作数栈,若是操作符则和操作符栈的栈顶运算符比较优先权作相应操作,直至整个表达式求值完毕.方式二首先把中缀表达式转换为后缀表达式并存储起来,然后利用读出的后缀表达式完成

数据结构(7)----栈与队列之栈的应用四则运算表达式求值

栈与队列之栈的应用四则运算表达式求值 栈在四则运算表达式求值的应用为逆波兰表达式(后缀表达式) 普通算式(中缀表达式):9 + (3 - 1) * 3 + 10 / 2     ---(1) 逆波兰表达式(后缀表达式):9 3 1 - 3 * + 10 2 /         ---(2) 1:逆波兰表达式的计算规则 从左到右遍历表达式的每个数字和符号,遇到数字就进栈,遇到符号,就将处于栈顶的两个数字出栈,进行运算,再把运算结果进栈,一直到最终获得结果.接下来我们以(2)式为例:

将中缀表达式转换为后缀表达式,然后利用栈对表达式求值。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js.js"></script> </head> <body> 输入中缀表达式空格分隔 例如 2 + 3 <input type=

c语言:表达式求值实现(包含加减乘除括号)

这道题不难,但是当你认真去编代码的时候,还是要考虑好多细节,所以不能只停留在看懂的层面上,不去实践你永远不知道你到底掌握了没有,加油! 之前的表达式求值不包括括号运算,现将改进后的代码和源代码粘在上面,便于以后的复习. 一.不包括括号运算 #include<iostream> #include<stdio.h> #include<stdlib.h> #include<string> #include<math.h> #define STACK_I

栈的两个应用:括号匹配的检验和表达式求值

1.     括号匹配的检验 假设表达式中含有3种括号:(),[],{},其嵌套的顺序随意.检验括号是否匹配. 基本思想:在算法中设置一个栈,每读入一个括号,若是右括号,则或者与栈顶匹配的左括号相互消解,或者是不合法的情况:若是左括号,则直接压入栈中.若括号匹配,在算法的开始和结束时,栈都应该是空的. 代码: /* * 判断表达式中的括号是否匹配,匹配输出Yes,否则输出No * {(zhang)+[lei]+{lei}={zhangleilei}} -> Yes * {(zhang)+[lei

NYOJ35 表达式求值 【栈】

表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧. 比如输入:"1+2/4=",程序就输出1.50(结果保留两位小数) 输入 第一行输入一个整数n,共有n组测试数据(n<10). 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以"

栈的应用—算术表达式求值

例三.算术表达式求值 1.问题描述 当一个算术表达式中含有多个运算符,且运算符的优先级不同的情况下,如何才能处理一个算术表达式????? 2.思路 首先我们要知道表达式分为三类:  ①中缀表达式:a+(b-c/d)*e ②前缀表达式+a*-be ③后缀表达式abcd/-e*+ 由于运算符有优先级,所以在计算机中计算一个中缀的表达式非常困难,特别是带括号的更麻烦,而后缀表达式中既无运算符优先又无括号的约束问题因为在后缀表达式中运算符出现的顺序正是计算的顺序,所以计算一个后缀的表达式更简单.所以,可