中缀表达式

一个晚上+初一走人家时YY

终于想出了自己的傻逼错误

思路如下:

1.中缀转表达式树

2.dfs求值

贴上丑陋不堪的代码

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #include<cstdlib>
  5
  6
  7 using namespace std;
  8
  9 //**************************************
 10 struct Node
 11 {
 12     int v;
 13     char ch;
 14     Node* lch;
 15     Node* rch;
 16     Node(){
 17         v = 0;
 18         ch = 0;
 19         lch = NULL;
 20         rch = NULL;
 21     }
 22 };
 23
 24 Node* newnode()
 25 {
 26     return new Node();
 27 }
 28
 29 void deletenode(Node* head)
 30 {
 31     if(head == NULL) return;
 32     if(head->lch != NULL) deletenode(head->lch );
 33     if(head->rch != NULL) deletenode(head->rch );
 34     delete head;
 35 }
 36 //********************************************
 37 const int maxn = 200000;
 38 char op[maxn];
 39 Node* root = newnode();
 40
 41 bool Onlyint(int start,int end)
 42 {
 43     for(int i = start;i < end;i++)
 44     {
 45         if(!(op[i] >= ‘0‘&&op[i] <= ‘9‘)) return false;
 46     }
 47     return true;
 48 }
 49
 50 void build_tree(int start,int end,Node* p)
 51 {
 52     int flag = 0,c1 = -1,c2 = -1;
 53     int v=0;
 54     if(Onlyint(start,end))
 55     {
 56         sscanf(&op[start],"%d",&v);
 57         p->v = v;
 58         return ;
 59     }
 60     for(int i = start;i < end;i++)
 61     {
 62         switch(op[i])
 63         {
 64             case ‘(‘:flag++;break;
 65             case ‘)‘:flag--;break;
 66             case ‘+‘:if(flag == 0) c1 = i;break;
 67             case ‘-‘:if(flag == 0) c1 = i;break;
 68             case ‘*‘:if(flag == 0) c2 = i;break;
 69             case ‘/‘:if(flag == 0) c2 = i;break;
 70         }
 71     }
 72     if(c1 < 0) c1 = c2;
 73     if(c1 < 0){
 74         build_tree(start+1,end-1,p);
 75         return ;
 76     }else{
 77         p->ch = op[c1];
 78         Node* lch = newnode();
 79         Node* rch = newnode();
 80         p->lch = lch;
 81         p->rch = rch;
 82         build_tree(start,c1,lch);
 83         build_tree(c1+1,end,rch);
 84     }
 85 }
 86
 87 int dfs(Node* p)
 88 {
 89     if(p->lch == NULL&&p->rch == NULL) return p->v;
 90     int val = 0;
 91     switch(p->ch)
 92     {
 93         case ‘+‘:val = dfs(p->lch) + dfs(p->rch);break;
 94         case ‘-‘:val = dfs(p->lch) - dfs(p->rch);break;
 95         case ‘*‘:val = dfs(p->lch) * dfs(p->rch);break;
 96         case ‘/‘:val = dfs(p->lch) / dfs(p->rch);break;
 97     }
 98     return val;
 99 }
100
101 int main()
102 {
103     scanf("%s",op);
104     Node* p =newnode();
105     p = root;
106     build_tree(0,strlen(op),p);
107     cout<<dfs(p);
108     deletenode(p);
109     return 0;
110 }

就酱吧

时间: 2024-10-05 13:21:31

中缀表达式的相关文章

关于中缀表达式的计算 和算符优先算法

中缀表达式计算:http://blog.sina.com.cn/s/blog_3fe961ae0100niq3.html 算符优先算法:http://blog.csdn.net/zhibudefeng/article/details/6937375 前中后缀表达式:http://blog.csdn.net/antineutrino/article/details/6763722/

适用于实数范围的中缀表达式的 + - * / ( ) 计算(C++实现)

核心算法: mid=FormatMid(mid); //格式化中缀表达式 JudgeLegalMid(mid); //判断中缀表达式的合法性 MidToPost mtp(mid); mtp.ToPost(post); //中缀表达式转后缀表达式 cout <<"结果:" <<Calc(post) <<endl; //计算后缀表达式 具体过程-- 第一步:格式化中缀表达式 这一步的目的是为了解决"-"的歧义问题:有时候"-

中缀表达式与前、后缀表达式转化简单的技巧[转]

35,15,+,80,70,-,*,20,/ //后缀表达方式 (((35+15)*(80-70))/20)=25 //中缀表达方式 /,*,+,35,15,-,80,70, 20 //前缀表达方式 人的思维方式很容易固定~~!正如习惯拉10进制.就对2,3,4,8,16等进制不知所措一样~~! 人们习惯的运算方式是中缀表达式.而碰到前缀,后缀方式..迷茫其实仅仅是一种表达式子的方式而已(不被你习惯的方式) 我这里教你一种也许你老师都没跟你讲的简单转换方式 一个中缀式到其他式子的转换方法 这里我

利用stack完成中缀表达式的四则运算

分析: 中缀表达式的操作符以中缀的形式处于操作数的中间. 若创建一个数字栈,一个运算符栈,并将一个中缀表达式从左至右压入栈这两个栈中.先向数字栈压入一个数字,再向运算符栈压入一个运算符,接着向数字栈压入数字.此时数字栈中有两个元素,字符栈中有一个元素. 当开始读到第二个运算符时就判断当前准备压入运算符与之前已在栈中运算符的优先级顺序,若栈顶的运算符优先顺序大于或等于当前即将压入的运算符,则弹出两个数字栈中的元素和一个运算符栈中的元素进行运算,将结果重新压回数字栈中,然后将当前的读到的运算符压入数

中缀表达式转为后缀表达式

** * 中缀表达式转后缀表达式 * * 作用:将一长串计算表达式转换为计算机易于操作的字符序列,用于计算器的设计 *  * 参与转换运算符 * +-/*()^% * * * 使用StringBuilder来保存转换出的后缀表达式 * 使用栈来操作运算符 * * * 转换原则 * 1.上述字符中()没有优先级值,+-优先级值为1,/*%优先级值为2,^优先级值为3 * 2.对于一个待计算的表达式,从左向右逐个检查每个字符 * 3.遇到数字,直接append到StringBuilder * 4.遇

中缀表达式转后缀表达式的方法:

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

C语言实现中缀表达式转后缀表达式

代码如下: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 typedef char ElemType; typedef struct { ElemType *base; ElemType *top; int StackSize; }sqStack; void InitStack(sqStack *

中缀表达式值

中缀表达式值(Expr.cpp) [问题描述] 输入一个中缀表达式(由0-9组成的运算数.加+减—乘*除/四种运算符.左右小括号组成.注意“—”也可作为负数的标志,表达式以“@”作为结束符),判断表达式是否合法,如果不合法,请输出“NO”:否则请把表达式转换成后缀形式,再求出后缀表达式的值并输出. 注意:必须用栈操作,不能直接输出表达式的值.如果再考虑是实数运算呢? [输入文件]Expr.in 输入文件的第一行为一个以@结束的字符串. [输出文件]Expr.out 如果表达式不合法,请输出“NO

中缀表达式转后缀表达式

写之前应该介绍一个厉害的波兰数学家--Jan Lukasiewicz(鲁卡谢维奇),他想到了一种不需要括号的后缀表达法,我们为了纪念他,把它称为逆波兰(Reverse Polish Notation,RPN)表示. 我们把平时所用的标准四则运算表达式,如:9+(3-1)×3+10/2,称为中缀表达式. 把9 3 1 - 3 * + 10 2 / +(此处由上一行的中缀表达式例子转化而来) 这种不需要括号表示的形式叫做后缀表达式,也是计算机非常喜欢的计算式. 转换规则: 从左到右遍历中缀表达式的每

中缀表达式转换前\后缀表达式的总结

本次个人程序设计要求做一个带有计算功能的程序,而要计算就离不开表达式,按照一般人的习惯,中缀表达式是一个非常常用的方式.但是,对于我们程序员来说,直接计算中缀表达式并不是那么方便,因此,通常来说我们会将中缀表达式进行转换. 不论是转成前缀表达式还是后缀表达式,通过树进行转换都是可以实现的,同时,一棵树就能完成前\中\后缀表达式的互相转换,因此如果仅仅要求转换并且频繁的转换,建立一棵树无疑是方便的.但是,对于计算而言,转换只是其中的一步,因此我们更要考虑效率问题,那么堆栈法就成了我们的首选.堆栈是