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

人:中缀表达式

计算机:后缀表达式

需要进行中缀转后缀,再计算。无论哪一步都需栈:

对于(3 + 4) × 5 - 6

一 中缀转后缀

涉及的栈用来存储符号如“+ - × / ( )”

思想:

遇见数字输出;遇见符号入栈

当空栈或者符号是左括号时直接入栈 ;

当是运算符时将要入栈的符号需要大于栈内符号否在现将栈内比该运算符大或者等的出栈输出,然后再入栈;

当运算符是右括号时,将栈内直到第一个左括号的符号出栈,并输出非括号的符号

算法:

//中缀表达式改成后缀表达式
void mid2after(char *a, char *&b){
int l=strlen(a);
int i=0,j=0;
sqstack s;
initstack(s);
while(i<l&&s.top>=-1){
if(a[i]>='0'&&a[i]<='9'){b[j++]=a[i++];if(a[i]<'0'||a[i]>'9')b[j++]=' ';}
else{
if(s.top==-1||a[i]=='(')s.data[++s.top]=a[i++];
else if(a[i]=='*'||a[i]=='/'){while(s.data[s.top]=='*'||s.data[s.top]=='/'){b[j++]=s.data[s.top--];}s.data[++s.top]=a[i++];}
else if(a[i]=='+'||a[i]=='-')
{while(s.data[s.top]=='+'||s.data[s.top]=='-'||s.data[s.top]=='*'||s.data[s.top]=='/'){b[j++]=s.data[s.top--];}
    s.data[++s.top]=a[i++];}
else if(a[i]==')'){i++;while(s.data[s.top]!='('){b[j++]=s.data[s.top--];}
s.top--;}
else if(a[i]==' ')i++;
else {cout<<"inlegal input!";return;}
}
}
while(s.top>-1){b[j++]=s.data[s.top--];}
}

二 后缀求值

后缀表达式求值栈主要用来存储数值

思想:

每遇见数字即入栈;

遇见运算符即出栈前两位运算,结果再入栈

注意后缀表达式木有括号。

算法:

//后缀求值
int get_after(char *b){
int l=strlen(b);
sqstack s;
initstack(s);
int i=0,ss;
while(i<l&&s.top>=-1){
 if(b[i]>='0'&&b[i]<='9'){
     ss=0;
while(b[i]>='0'&&b[i]<='9')
{
    int j=1;
    j=(b[i]-'0');
    ss=ss*10+j;
     i++;
    // cout<<ss<<" ";
}
   s.data[++s.top]=ss;
}
else {int t=s.data[s.top];
    switch (b[i])
    {case '+':s.data[--s.top]=s.data[s.top]+t;break;
     case '-':s.data[--s.top]=s.data[s.top]-t;break;
     case '*':s.data[--s.top]=s.data[s.top]*t;break;
     case '/':{if(t==0)return -100;s.data[--s.top]=s.data[s.top]/t;break;
              }
     case ' ':break;
    default:{cout<<"error! "<<b[i];return -100;}
    }
    i++;}
}
if(s.top>-1)return s.data[s.top];
}
时间: 2024-10-19 18:07:09

中缀表达式求后缀,再由后缀表达式求值的相关文章

1、打印二进制机器码,程序内存分析,大端序小端序,指针数组,数组指针,数组的三种访问方式,typedef,#if-0-#endif,求数组大小,括号表达式

 1.打印二进制机器码(分别表示32位的和64位的) #include <stdio.h> /*按照8位的长度打印一个数值*/ void dis8bit(char val) { int bit = 8; while(bit--) { if(1<<bit&val){ printf("1"); } else { printf("0"); } if(!(bit%4)) printf(" "); } putchar(1

康复计划#1 再探后缀自动机&amp;后缀树

本篇口胡写给我自己这样的东西都忘光的残废选手 以及那些刚学SAM,看了其他的一些东西并且没有完全懵逼的人 (初学者还是先去看有图的教程吧,虽然我的口胡没那么好懂,但是我觉得一些细节还是讲清楚了的) 大概是重复一些有用的想法和性质,用以加深印象吧-如果可以的话希望也能理解得更透彻一点- 1.如何设计出一个后缀自动机? 现在用的SAM并不是本来就在那里的,要比较深入地理解,就不能只从验证它对不对的角度考虑,而要考虑为什么它是这个样子. 要一个能够接受后缀的有限状态机,并不用像现在的SAM那样弄,比如

javascript使用栈结构把忠置表达式转后为后置表达式并计算值

1.概念 你可能听说过表达式,a+b,a+b*c这些,但是前缀表达式,前缀记法,中缀表达式,波兰式,后缀表达式,后缀记法,逆波兰式这些都是也是表达式. a+b,a+b*c这些看上去比较正常的是中缀表达式,就是运算符放在两个操作数之间.前缀表达式是将运算符放在相关操作数之前,后缀表达式是将运算符放在操作数之后. 至于前面说的那些概念: 前缀表达式就是波兰式就是前缀记法 后缀表达式就是逆波兰式就是后缀记法 举例如下: (3+4)*5-6就是中缀表达式 -*+3456就是前缀表达式 34+5*6-就是

C编译器剖析_4.2 语义检查_表达式的语义检查(6)_一元运算符表达式

在这一小节中,我们来讨论一元运算符表达式的语义检查,与其相关的代码如图4.2.35所示.对于"前加加"和"前减减"运算符而言,我们采取的策略跟处理"后加加"和"后减减"一样,都是将--a转换为a -= 1,而将++a转换为a += 1,所以图4.2.35第5行调用的函数,就是我们在讨论后缀表达式语义检查时介绍过的函数TransformIncrement().对于形如+a或-a的表达式,我们需要检查一下a是否为算术类型,由于表达

[TJOI2015]弦论(后缀数组or后缀自动机)

解法一:后缀数组 听说后缀数组解第k小本质不同的子串是一个经典问题. 把后缀排好序后第i个串的本质不同的串的贡献就是\(n-sa[i]+1-LCP(i,i-1)\)然后我们累加这个贡献,看到哪一个串的时候,这个贡献的和大于等于k,然后答案就在这个串里了,然后枚举就行了. 那么第k小子串该怎么办? 我们考虑二分答案,我们按字典序大小二分一个子串(具体就是二分第k小的本质不同子串,因为这个串可以\(O(n)\)求),然后看看比这个串小的串有多少个?然后改变上下界就行了. 那么我们如何求出比一个串小的

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

利用后缀数组构造后缀树

由于蒟蒻azui前段时间忙着准备省选,并在省选中闷声滚大粗,博客停更了好久.. 省选过后整个人各种颓,整天玩玩泥巴什么的... 前段时间学后缀数组的时候上网查相关资料,看到说后缀数组和后缀树是可以相互转化的,并且uoj上有大量通过后缀自动机建出后缀树然后dfs遍历获得后缀数组的模板,但是通过后缀数组来建后缀树的资料确实稀缺. 也许大牛们都觉得这xjbYY一下就可以写了,所以网上没找到对应的代码,那么我来补个坑吧.大牛勿喷.. 先谈谈我的理解吧.. 讲道理后缀数组和后缀树应该是完全等价的,但前两者

hdu 5008 Boring String Problem(后缀自动机构造后缀树)

hdu 5008 Boring String Problem(后缀自动机构造后缀树) 题意:给出一个字符串s,然后每次询问一个k,求s的所有子串中,字典序第k小的是谁?多个解,则输出最左边的那个 解题思路:这道题应该是为后缀树量身定制的吧.只要构造出了后缀树,然后按字典序遍历就可以得出每个节点包含的子串的字典序的范围了,而且必然是个连续的区间范围.但是我不会后缀树啊..比赛的时候突然想到,后缀自动机是可以构造后缀树的,虽然以前没写过,但还是硬着头皮上吧,居然还真的让我给撸出来了.我的做法是这样的

Python基础----生成器、三元表达式、列表生成式、生成器表达式

Python开发基础-Day9-生成器.三元表达式.列表生成式.生成器表达式 生成器 生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器,生成器在本质上就是迭代器. def foo(): print('first------>') yield 1 print('second----->') yield 2 print('third----->') yield 3 print('fouth----->') g=foo() from collections impor

一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?

/** * 一球从100米高度自由落下,每次落地后反跳回原高度的一半:再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高? * */ public class Test2 { public static void main(String[] args) { double num = 100, sum = 0; for (int i = 0; i < 10; i++) { sum += num*2; num /= 2; } sum -= 100; System.out.println(