表达式计算
来源:互联网 发布:马伯乐了知 编辑:程序博客网 时间:2024/06/06 02:47
表达式计算对于我们人来说,喜欢通过中缀表达式来计算,而计算机则不一样,需要通过后缀表达式来计算,首先通过实例来介绍一下中缀表达式和后缀表达式
例子
中缀表达式:3*(5+2)-3 *6
后缀表达式:3 5 2 + * 3 6 *-
那么转换规则是怎么样的呢?
规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。
图解可以自行百度,这里就不多加赘述了
进行表达式计算算法的实现则需要两个栈。存储数字的栈,存储字符的栈。
通过规则将表达式中的数字和字符分别存入两个栈中,如果存储在字符栈中的运算符被输出,则数字栈顶两个数字进行被输出运算符的运算(栈顶第一个数对栈顶第二个数进行操作)并将结果存入数字栈中。直到字符遍历完成,且运算符栈为空。
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<stack>using namespace std;stack<char> stack_ch;//符号栈stack<int> stack_num; //数值栈char str[1000]; //输入的中缀表达式char number[100]; //用来将字符串中的数字变成int型的数组void js1()//这个函数只接收+-号,+-号等级最低,运算符栈中除了括号外 都可以取出运算{ int num1,num2; while (stack_ch.top()!='(') //从运算符栈中取一个运算符 对数值栈顶和次顶元素进行运算 { num1=stack_num.top();//取出一个数 stack_num.pop();//弹出这个数 num2=stack_num.top(); stack_num.pop(); switch (stack_ch.top()) { case '+': num2+=num1; break; case '-': num2-=num1; break; case '*': num2*=num1; break; case '/': num2/=num1; break; } stack_num.push(num2);//将计算结果入数值栈 stack_ch.pop();//删除已经用过的符号 }}void js2()//只接收 / *运算符{ int num1,num2; while (stack_ch.top()=='*' || stack_ch.top()=='/') //栈中只有优先级大于 { num1=stack_num.top(); stack_num.pop(); num2=stack_num.top(); stack_num.pop(); switch (stack_ch.top()) { case '*': num2*=num1; break; case '/': num2/=num1; break; } stack_ch.pop(); stack_num.push(num2); }}int main(){ int i,k=0,s; char c[5]="."; stack_ch.push('('); gets(str); strcat(str,c);//将‘.’连接到表达式字符串中使其判断表达式字符串已读完 for (i=0;str[i];i++) { if (str[i]>='0'&&str[i]<='9')//为数字 { number[k++]=str[i]; continue; } number[k]='\0'; //变成字符串\0结尾 if (number[0]!='\0') { s=atoi(number);//取字符串中首个数字字符所表达的数 number[0]='\0'; stack_num.push(s); //将字符串转换成整型,放入数值栈中 } k=0; switch(str[i])//‘+-(’这3个符号入js1函数,入js2函数 ,优先级不同要分开计算 { case '+': js1(); stack_ch.push('+'); break; case '-': js1(); stack_ch.push('-'); break; case '*': js2(); stack_ch.push('*'); break; case '/': js2(); stack_ch.push('/'); break; case '(': stack_ch.push('('); break; case ')': js1(); stack_ch.pop(); break; case '.': { js1(); stack_ch.pop(); } } } printf("%d\n",stack_num.top()); return 0;}
阅读全文
0 0
- 表达式计算
- 表达式计算
- 表达式计算
- 表达式计算
- 表达式计算
- 表达式计算
- 表达式计算
- 计算表达式
- 表达式计算
- 表达式计算
- 表达式计算
- 表达式计算
- 表达式计算 .
- 计算表达式
- 计算表达式
- 表达式计算
- 表达式计算
- 表达式计算
- PL/SQL 测试 调用PROCEDURE 和FUNCTION
- 安装Eclipse Jee Oxygen后项目的js和json文件报错
- CV论文笔记(三)Convolutional-De-Convolutional Networks for Precise Temporal Action Localization in Untrimm
- 不调用C++/C字符串库函数,实现字符串复制函数strcpy
- 接口的回调与回调机制
- 表达式计算
- Java消息中间件
- echats3.7样式问题
- 自己动手搭建GitLab
- codeforces 617E 莫队入门
- LeetCode#718 Maximum Length of Repeated Subarray (week9)
- 提示框
- LeetCode 410: Split Array Largest Sum 解题与思考
- CNN和RNN在自然语言中的适用场景