#include<iostream>
#include<algorithm>
#include<cstring>
#define max 11
using namespace std;
struct zzhs{
char arr[max];
char data[max];
int top;
};
enum ysf{//枚举类型,在此用作判断函数中数组的下标。
zkh,ykh,jia,jian,chen,chu,yv,sz//分别是左括号,右括号,加减乘除,取余,数值的中文缩写
};
struct zzhs s;
void cun()//存入
{
strcpy(s.arr, "5/(4-3)*2");
}
int pdw(char a)//判断栈外的函数
{
int brr[9]={20,19,12,12,13,13,13,0};//代表的为enum类型的运算符下标 ,为了比较栈内外而创建的栈外大小
switch (a) {
case '+': return brr[jia];//jia在枚举类型中为第3个,进入数组brr中为12,
case '-': return brr[jian];//jia在枚举类型中为第4个,进入数组brr中为12,以此类推
case '*': return brr[chen];
case '/': return brr[chu];
case '(': return brr[zkh];
case ')': return brr[ykh];
default : return brr[sz];
}
}
int pdl(char a)//判断栈里的函数
{
int crr[9]={1,19,12,12,13,13,13,0};//这是栈内的大小,主要服务于括号的存在,因为左括号进入后必须变动,不然后面没有比左括号大的就死栈了
switch (a) {
case '+': return crr[jia];
case '-': return crr[jian];
case '*': return crr[chen];
case '/': return crr[chu];
case '(': return crr[zkh];
case ')': return crr[ykh];
default : return crr[sz];
}
}
void fhbj()//返回比较,中缀转后缀,核心为如果栈外元素大于栈内元素入栈,小于或为数字直接输出,等于让栈内的出去,自己再进去
{
int i=0;
//开头就判断一次是否能进
if(pdw(s.arr[i])>pdl(s.data[s.top-1]))//判断外是否大于里,大于就进去
{
s.data[s.top]=s.arr[i];i++;s.top++;
}
else if(pdw(s.arr[i])==pdl(s.data[s.top-1]))//因为里面存有一个sz类型的函数,在判断数组中为0,与它相等的直接输出
cout<<s.arr[i],i++;
else cout<<"空";//否则直接判空
while(s.arr[i]!='\0') //在没有遇到\0之前一直循环
{
if(pdw(s.arr[i])==19)//判断外面,如果遇见了右括号 不输出,arr的下标直接加1
{i++;
while(pdl(s.data[s.top-1])!=1)//进入循环,判断里面s.top-1是否为左括号
{
s.top--;cout<<s.data[s.top];//不是就输出减去1后的元素
}s.top--;//跳出循环后再次自减,目的是为了补齐跳出循环时遗漏的那一次
}
else if(pdw(s.arr[i])>pdl(s.data[s.top-1]))//如果外面大于里面就进去,然后更新下标,arr的下标+1,栈内的top也+1
{
s.data[s.top]=s.arr[i];i++;s.top++;
}
else if(pdw(s.arr[i])==pdl(s.data[s.top-1]))//如果运算先后等级相等里面的出来,外面的进去
{
cout<<s.data[s.top-1];s.top--;
s.data[s.top]=s.arr[i];i++;s.top++;
}
else if(pdw(s.arr[i])<pdl(s.data[s.top-1]))//如果外小于里的直接输出外面的,arr下标自加
{
cout<<s.arr[i];i++;
}
}cout<<s.data[--s.top];//同理,为了弥补跳出循环遗漏的那一次
}
int main()
{
s.top=0;//可看作下标
s.data[s.top]='0';//就让这个0永远的在栈的最下方,
s.top++; //因为放了个0,top往前移动一位
cun();
fhbj();//最后成功将中缀表达式转化为了后缀表达式
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复