一、实验目的
将非后缀式用来表示的算术表达式转换为用逆波兰式来表示的算术表达式, 并计算用逆波兰式来表示的算术表达式的值。
二、实验原理
三、实验代码
main.cpp
#define _CRT_SECURE_NO_WARNINGS
#include"stdio.h"
#include "stdlib.h"
#include<iostream>
using namespace std;
#include <stack>
#include "OPG.h"
//逆波兰表达式变量和函数的声明
stack<float> s2; //s2作为数字栈
char arr[80] = {
0 }; //存储中缀表达式
char str1[80] = {
0 }; //存储初始后缀表达式
char str2[80] = {
0 }; //存储最终后缀表达式
int num[80] = {
0 }; //存储后缀表达式中的数字
void deal(); //由中缀生成后缀
void number(char str[]); //实现逆波兰表达式的计算
void main()
{
init();
deal();
number(str2);
}
//算符优先关系表已经有了,开始生成逆波兰式
void deal()
{
//清空缓冲区
char c;
while ((c = getchar()) != '\n' && c != EOF);
printf("请输入中缀表达式,以'#'结尾:");
gets_s(arr);
// printf("test1 arr=%s\n", arr);//测试打印arr
int i, j = 0;
stack <char>s;
s.push('#'); //初始化栈
//从左至右依次扫描字符串
for (i = 0; arr[i] != 0; i++)
{
char sym = arr[i];
if (sym >= '0' && sym <= '9')
{
int k = 0;
str1[j] = sym;
j++;
//向后看一位,如果不是数字,则加分隔符&
if (arr[i + 1] > '9' || arr[i + 1] < '0')
{
str1[j] = '&';
j++;
}
}
else
{
for (;;)
{
int x = xiabiao(s.top());
int y = xiabiao(sym);
if (dat[x][y] == '<')
{
s.push(sym);
break;
}
else
{
if (dat[x][y] == '=')
{
if (s.top() == '(' && sym == ')')
{
s.pop();
break;
}
else
break;
}
else
{
str1[j] = s.top();
j++;
s.pop();
}
}
}
}
}
//打印出初始逆波兰表达式
// printf("%s\n",str1);
//再次处理逆波兰表达式
for (i=0,k=0;str1[i]!=0;i++)
{
//如果是分隔符&,向后看一位,如果下一个不是数字,则不需要分隔符&
if(! (str1[i] == '&'&&(str1[i+1]>'9'||str1[i+1]<'0')))
{
str2[k] = str1[i];
k++;
}
}
printf("逆波兰表达式:%s\n", str2);
}
//实现逆波兰表达式的计算
void number(char str[])
{
int k = 0, p = 1;
float a = 0, b = 0, c = 0;
for (int i = 0; str[i] != 0; i++)
{
//如果是数字,将逆波兰式的数字串处理成数字
if (str[i] <= '9' && str[i] >= '0')
{
//如果下一个不是数字
if (str[i + 1] > '9' || str[i + 1] < '0')
{
num[k] = str[i] - '0'