慕课MOOC表达式求值
前言
一、后缀表达式是什么?
后缀表达式计算与前缀表达式类似,只是顺序是从左至右,具体过程如下:
从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果
例如:后缀表达式为“2 3 + 4 × 5 -”计算过程如下:
(1)从左至右扫描,将 2 和 3 压入堆栈;
(2)遇到 + 运算符,因此弹出 3 和 2( 3 为栈顶元素,2 为次顶元素,注意与前缀表达式做比较),计算出 3+2 的值,得 5,再将 5 入栈;
(3)将 4 入栈;
(4)接下来是 × 运算符,因此弹出 4 和 5,计算出 4 × 5 = 20,将 20 入栈;
(5)将 5 入栈;
(6)最后是-运算符,计算出 20-5 的值,即 15,由此得出最终结果。
二、中缀表达式转化成后缀表达式
1.中缀表达式转换后缀表达式示例
2.符号运算操作
从头到尾读取中缀表达式的每个对象,对不同对象按不同的情况处理
① 运算数:直接输出;
② 左括号:压入堆栈;
③ 右括号:将栈顶的运算符弹出并输出,直到遇到左括号(出栈,不输出);
④ 运算符:
• 若优先级大于栈顶运算符时,则把它压栈;
• 若优先级小于等于栈顶运算符时,将栈顶运算符弹出并输出;再比
较新的栈顶运算符,直到该运算符大于栈顶运算符优先级为止,然
后将该运算符压栈;
⑤ 若各对象处理完毕,则把堆栈中存留的运算符一并输出。
3.C++语言代码
代码如下(示例):
#include<iostream>
#include<string.h>
#include<stack>
using namespace std;
stack<char> a;
char str[105];
char s[105];
int Stack[60];
int top = -1;
int i,k = 0;
void Count()
{
for(i = 0;i<strlen(s);i++)
{
if(s[i]==' ') continue;
switch(s[i])
{
case '+': Stack[--top]+=Stack[top+1];break;
case '-': Stack[--top]-=Stack[top+1];break;
case '*': Stack[--top]*=Stack[top+1];break;
case '/': Stack[--top]/=Stack[top+1];break;
default : Stack[++top] = s[i]-'0' ;break;
}
}
printf("\n%d",Stack[top]);
}
int num(char ch)
{
int flag;
if(ch=='+'||ch=='-') flag = 1;
if(ch=='*'||ch=='/') flag = 2;
if(ch=='(') flag = 3;
if(ch==')') flag = 0;
return flag;
}
bool Judge(char ch)
{
int x,y;
if(a.empty()||a.top()=='(') return false; //左括号在进入堆栈后,优先级降为最低
x = num(a.top());
y = num(ch);
if(x>=y) return true;
else return false;
}
int main()
{
gets(str);
for(int j = 0;j<strlen(str);j++)
{
bool flag;
if(str[j]==' ')
{
continue;
}
if(str[j]>='0'&&str[j]<='9')
{
printf("%c",str[j]);
s[k++] = str[j];
continue;
}
if(a.empty())
{
a.push(str[j]);
continue;
}
if(str[j]==')')
{
while(a.top()!='(')
{
printf("%c",a.top());
s[k++] = a.top();
a.pop();
}
a.pop();
continue;
}
flag = Judge(str[j]);
if(flag==true)
{
while(flag==true)
{
printf("%c",a.top());
s[k++] = a.top();
a.pop();
flag = Judge(str[j]);
if(!flag)
{
a.push(str[j]);
break;
}
}
}
else if(!flag)
{
a.push(str[j]);
continue;
}
}
while(!a.empty())
{
printf("%c",a.top());
s[k++] = a.top();
a.pop();
}
Count();
return 0;
}
代码效果
注意点
在处理括号时,注意第一次遇到左括号时,左括号为最高的优先级,进入堆栈后,左括号优先级降为最低
结语
大家好,这是我的代码,新人首篇喜欢能帮助到大家
当然最最最重要的是相互交流学习~