中缀表达式值

中缀表达式值(Expr.cpp)

【问题描述】

输入一个中缀表达式(由0-9组成的运算数、加+减—乘*除/四种运算符、左右小括号组成。注意“—”也可作为负数的标志,表达式以“@”作为结束符),判断表达式是否合法,如果不合法,请输出“NO”;否则请把表达式转换成后缀形式,再求出后缀表达式的值并输出。

注意:必须用栈操作,不能直接输出表达式的值。如果再考虑是实数运算呢?

【输入文件】Expr.in

输入文件的第一行为一个以@结束的字符串。

【输出文件】Expr.out

如果表达式不合法,请输出“NO”,要求大写。

如果表达式合法,请输出计算结果。

【输入样例】

1+2×8―9

【输出样例】

8

  1 #include<iostream>
  2 #include<cmath>
  3 #include<cstdio>
  4 #include<cstring>
  5 using namespace std;
  6 int  number[101],i=0, p=1;
  7 char symbol[101],s[256],t[256];
  8 void push()      //算符入栈运算
  9 {
 10   symbol[++p]=s[i];
 11 }
 12 void pop()       //运算符栈顶元素出栈,并取出操作数栈元素完成相应的运算
 13 {
 14    switch (symbol[p--])//运算完成之后扔掉运算符,也标志着需要运算的数已经运算完成
 15    {
 16       case ‘+‘:
 17       {
 18           number[p]+=number[p + 1];
 19           break;
 20       }
 21       case ‘-‘:
 22       {
 23           number[p]-=number[p + 1];
 24           break;
 25       }
 26          case ‘*‘:
 27       {
 28           number[p]*=number[p + 1];
 29          break;
 30         }
 31       case ‘/‘:
 32       {
 33           number[p]/=number[p + 1];
 34           break;
 35       }
 36       case ‘^‘:
 37       {
 38         number[p]=pow(number[p],number[p + 1]);
 39       }
 40    }
 41 }
 42 bool can()            //判断运算符的优先级别,建立标志函数,能否进行运算
 43 {
 44   if ((s[i]==‘+‘||s[i]==‘-‘)&&symbol[p]!=‘(‘) //在括号之内
 45   return 1;
 46   if ((s[i]==‘*‘||s[i]==‘/‘)&&(symbol[p]==‘*‘||symbol[p]==‘/‘))
 47   //若遇到乘除且p对应的恰好是乘除
 48   return 1;
 49   return 0;
 50 }
 51 bool judge(char s[256])
 52 {
 53     int top=0,i=0;
 54     while (s[i]!=‘@‘)
 55     {
 56         if (s[i]==‘(‘) top++;
 57         if (s[i]==‘)‘)
 58         {
 59            if (top>0) top--;
 60              else return 0;
 61         }
 62         i++;
 63     }
 64     if (top!=0) return 0;          //检测栈是否为空。不空则说明有未匹配的括号
 65     else return 1;
 66 }
 67 int main()
 68 {
 69     gets(s);
 70     if(judge(s)==0)
 71     {
 72         cout<<"NO";
 73         return 0;
 74     }
 75
 76     s[strlen(s)]=‘)‘;
 77   symbol[p]=‘(‘;
 78   while (i<strlen(s))
 79 {
 80       while (s[i]==‘(‘)            //左括号处理,压入左括号,有了左括号才能进行与右括号的匹配 while (symbol[p]!=‘(‘)
 81       {
 82           push();
 83           i++;
 84       }
 85       int x=0;
 86       while (s[i]>=‘0‘&&s[i]<=‘9‘)  //取数入操作数栈
 87          x=x*10+s[i++]-‘0‘;
 88       number[p]=x;
 89       do
 90       {
 91           if (s[i]==‘)‘)            //当右括号后面还有右括号时处理
 92           {
 93             while (symbol[p]!=‘(‘)
 94             pop();//当括号内还有算式没有算完时进行运算
 95             number[--p]=number[p + 1];//当运算完成以后左括号已经没有意义,所以将指针p移向前一个运算符,并复制所得的结果
 96           }
 97           else
 98           {                   //根据标志函数值作运算符入栈或出栈运算处理
 99             while (can())
100             pop();// 当可以进行运算时运算,然后压入一个运算符
101             push();
102           }
103         i++;
104       }while (i<strlen(s)&&s[i-1]==‘)‘);//当检测到右括号时,可以运算括号内的内容
105   }
106   printf("Result=%d", number[0]);//因为所有的运算全部是建立在括号之内的,所以随着运算符的减少(运算符减少同时标志着需要操作的数减少)和最后的p--,结果一定保存在number[0]内
107     return 0;
108 }
时间: 2024-11-04 20:13:22

中缀表达式值的相关文章

运用栈把算术表达式+,-,*,/,%(中缀表达式)转换成后缀表达式并且计算出值

原理: 1.首先判断是数值还是符号,如果是数值放进字符数组以#表示结束, 2.如果是符号,放进栈, 3.每个符号之间要比较优先级,如果栈顶符号优先级低,符号进栈,如果相等(即“(” “)”)出栈,栈顶符号优先级高,栈顶元素出栈进入字符数组,得到后缀表达式 4.计算后缀表达式,判断是数字还是符号.直到遇到符号,将前面的数字计算后放进栈,一直重复,知道“\0” 代码(局限用整数,因为有模运算,若要任何类型的代码,我的blog有) 1 #include <stdio.h> 2 #include &l

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

<!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++ Stack

给一个包含小数的中缀表达式 求出它的值 首先转换为后缀表达式然后利用stack求出值 转换规则: 如果字符为'('  push else if 字符为 ')' 出栈运算符直到遇到'(' else if 字符为'+','-','*','/' { if 栈为空或者上一个运算符的优先级小于当前运算符 push else { 运算符优先级小于等于栈顶运算符的优先级,出栈 然后!将当前运算符入栈! } } 代码 #include<iostream> #include<cstdio> #inc

中缀表达式求值总结

中缀表达式的题目困扰了我两三年,都没去写过..这两天看到2005年提高组的T3要用到所以心血来潮写了一下. 表达式求值借助基本结构应该不用说了是栈,不管手写还是STL都没有太大关系.而中缀表达式最难控制的地方是优先级,算上+-*/^()一共有四个优先级[+-,*/,, ^()](后面会提到一个三级的字符“负号”,这是预留空位). 下面对一个例子进行分析:2*3+4*6/3+17-4^2 那么处理的时候怎么控制优先级呢? 搜到‘+’之前,栈的情况是这样的: 操作数栈:2  3 操作符栈:* 然后搜

中缀表达式求后缀,再由后缀表达式求值

人:中缀表达式 计算机:后缀表达式 需要进行中缀转后缀,再计算.无论哪一步都需栈: 对于(3 + 4) × 5 - 6 一 中缀转后缀 涉及的栈用来存储符号如"+ - × / ( )" 思想: 遇见数字输出:遇见符号入栈 当空栈或者符号是左括号时直接入栈 ; 当是运算符时将要入栈的符号需要大于栈内符号否在现将栈内比该运算符大或者等的出栈输出,然后再入栈; 当运算符是右括号时,将栈内直到第一个左括号的符号出栈,并输出非括号的符号 算法: //中缀表达式改成后缀表达式 void mid2a

中缀表达式转换成后缀表达式并求值

算法: 中缀表达式转后缀表达式的方法: 1.遇到操作数:直接输出(添加到后缀表达式中) 2.栈为空时,遇到运算符,直接入栈 3.遇到左括号:将其入栈 4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出. 5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈 6.最终将栈中的元素依次出栈,输出. 例如 a+b*c+(d*e+f)*g ----> abc*+de*f+g*+ 遇到a:直接输出: 后缀表达式:a 堆栈:空 遇到

中缀表达式求值问题

           中缀表达式求值问题 中缀表达式的求值问题是一个比较常见的问题之一,我们通常在编写程序时,直接写出表达式让编译器去处理,很少去关心编译器是怎么对表达式进行求值的,今天我们来一起了解一下其中具体的原理和过程. 表达式一般来说有三种:前缀表达式.中缀表达式.后缀表达式,其中后缀表达式又叫做逆波兰表达式.中缀表达式是最符合人们思维方式的一种表达式,顾名思义,就是操作符在操作数的中间.而前缀表达式和后缀表达式中操作符分别在操作数的前面和操作数的后面.举个例子: 3+2 这个是最简单的

刁肥宅详解中缀表达式求值问题:C++实现顺序/链栈解决

1. 表达式的种类 如何将表达式翻译成能够正确求值的指令序列,是语言处理程序要解决的基本问题,作为栈的应用事例,下面介绍表达式的求值过程. 任何一个表达式都是由操作数(亦称运算对象).操作符(亦称运算符)和分界符组成的.通常,算术表达式有3种表示: ①中缀(infix)表示:<操作数><操作符><操作数>,如A+B. ②前缀(prefix)表示: <操作符><操作数><操作数>,如+AB. ③后缀(postfix)表示: <操作

中缀表达式求值

中缀表达式用于计算一个表达式,比如计算器 就是这样实现的 这儿是用栈的数据结构来实现的.首先输入一个字符串,表示一个表达式,然后用一个栈存储数字,另外一个栈存储符号 如果当前运算符优先级比栈顶元素优先级高,则入栈,若当前运算符优先级小于等于栈顶运算符优先级,则从数字栈中弹出两个元素,从符号栈中弹出一个符号,计算结果入栈(数字栈): 代码如下: #include<iostream> using namespace std; #include<cstring> #include<