在上一节我们讲了中缀表达式如何转后缀表达式,并且给出了C++代码实现,当然我承认,上次写代码的时候有点昏昏沉沉的,所以写的并不好,逻辑不是很清晰,不过还好没错啦,这次我们来讨论后缀表达式计算的实现。
后缀表达式怎么计算?请参考我的上一篇文章,这里不做具体讲解了。
额 我想想,编程的具体计算步骤我们还是要讨论的。使用栈进行解决。
约法三章:
1.遇到数字不操作,直接压栈。‘
2.遇到运算符,则弹出运算符前两个数字,进行该运算,将计算结果压栈。
3.从头向后扫描,直到只剩一个数字为止,则其为最后答案。
其实也不是很难对吧,编程实现应该是小意思。
测试数据:5*7+8-9*(2-6)+6/3;
正确答案为:81
有图有真相,不信你去算
代码实现
// 中缀表达式转后缀表达式.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include"iostream"
using namespace std;
typedef struct SqStack
{
char date[30];
int top=0;
}SqStack;
typedef struct iinum
{
int date[30];
int top = 0;
}iinum;
//用于确定符号的优先级 i=true代表内优先,否则为外优先,返回值为-1时,代表是数字。
int mynum(char a, bool i)
{
if (a == '#')
return 0;
if (a == '(')
if (i == true)
return 1;
else
return 6;
if (a == ')')
if (i == true)
return 6;
else
return 1;
if (a == '*'||a=='/')
if (i == true)
return 5;
else
return 4;
if (a == '+' || a == '-')
if (i == true)
return 3;
else
return 2;
return -1;
}
//对栈进行操作的函数
void transform(char* oldl, char* inew)
{
int num = 0,inum=0,n=0;
SqStack a;//生成栈区
char old[30];
//对表达式前后加#
old[0] = '#';
int ii = 0;
for (ii = 0; oldl[ii] != '\0'; ii++)
{
old[ii + 1] = oldl[ii];
}
old[ii+1] = '#';
old[ii + 2] = '\0';
//加#结束
for (int i = 0; i < 30; i++)
{
a.date[i] = 0;
}
//栈区清空
a.date[a.top] = '#';
//首#入栈
//对表达式进行转换
for (int i = 1; old[i] != '\0'; i++)
{
num = mynum(old[i], 0);
if (num != -1)
{
inum = mynum(a.date[a.top], 1);
if (num > inum)
{
a.top++;
a.date[a.top] = old[i];
}
else if (num == inum)
{
a.date[a.top] = 0;
a.top--;
}
else
{
inew[n] = a.date[a.top];
n++;
a.top--;
i--;
}
}
else
{
inew[n] = old[i];
n++;
}
}
inew[n] = '\0';
}
//计算模块
int compute(char* a)
{
int num = 0, inum = 0;
iinum c;
c.date[0] = a[0] - 48;
for (int i = 1; a[i] != '\0'; i++)
{
if (a[i] == '+')
{
c.date[c.top - 1] = c.date[c.top] + c.date[c.top - 1];
c.top--;
}
else if (a[i] == '-')
{
c.date[c.top - 1] = c.date[c.top-1] - c.date[c.top ];
c.top--;
}
else if (a[i] == '*')
{
c.date[c.top - 1] = c.date[c.top] * c.date[c.top - 1];
c.top--;
}
else if (a[i] == '/')
{
c.date[c.top - 1] = c.date[c.top-1] / c.date[c.top ];
c.top--;
}
else
{
c.top++;
c.date[c.top] = a[i]-48;
}
}
return c.date[c.top];
}
int main()
{
char s[30] = "5*7+8-9*(2-6)+6/3";
char ss[30];
transform(s, ss);
cout << "正确答案为:81;计算结果为" << compute(ss) << endl;
system("pause");
return 0;
}
本文为作者原创,任何形式的引用、转载等操作请提前获得作者授权,未经授权,禁止以任何形式引用或转载此文。