//这个是用顺序栈实现将中缀变为后缀表达式
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define MaxSize 100
typedef struct{
char data[MaxSize];//栈中放的是运算符
int top;
}SqStack;
void InitStack(SqStack &S){
S.top==-1;
}
bool Empty(SqStack S){
return S.top==-1;
}
bool Push(SqStack &S ,char e){
if(S.top==MaxSize -1)
return false;//栈满了
S.data[++S.top]=e;
return true;
}
bool Pop(SqStack &S,char &e){
if(S.top==-1)
return false;//栈空了
e=S.data[S.top--];
return false;
}
bool middle_to_postfix(char str[],string &ret){
SqStack S;
InitStack(S);
char operate;
int i=0;
while(str[i]!='\0'){
if (str[i] >= '0' && str[i] <= '9'){
while (str[i] >= '0' && str[i] <= '9') { //如果是99,12.5这种数字
ret+=str[i];
if (str[i + 1] >= '0' && str[i + 1] <= '9') i++;
else break;
}
ret+=' ';
i++;
}
else if (str[i] == '('){ //左括号进入时优先级最高,直接压入栈
Push(S, str[i++]);
}
else if (str[i] == ')') //右括号进入时优先级低,一直出栈直到遇到左括号
{
while (!Empty(S)) {
Pop(S,operate);
if (operate == '('){ //如果为右括号则停下
i++;
break;
}
else{
ret += operate; //否则一直弹出运算符
ret+=' ';
}
}
}
//4.运算符
else
{
//4.1运算符为乘除
if (str[i] == '*' || str[i] == '/')
{
while (!Empty(S)) {
Pop(S,operate); //将运算符弹出栈
if (operate == '('){
Push(S,operate);
break;
}
else
{
if (operate == '+' || operate == '-') //如果为加或减(优先级小)则重新将他们压回去
{
Push(S, operate);
break; //不要忘了break,不然就死循环了,一直出栈入栈...
}
else{//乘除的情况 就栈顶元素出栈
ret += operate;
ret+=' ';
}
}
}
}
//4.2运算符为加减
else if (str[i] == '+' || str[i]== '-')
{
while (!Empty(S)) {
Pop(S,operate);
if (operate == '('){
Push(S,operate);
break;
}
else
{
ret += operate;
ret+=' ';
//因为加减不管遇到加减还是乘除,都不能满足优先级大,所以都要弹出并加入后缀表达式
}
}
}
Push(S, str[i++]); //这是包含在情况4中的 表示将当前运算符压入栈
}
}
while (!Empty(S)){
Pop(S,operate);
ret+=operate;
ret+=' ';
}
return true;
}
int main(){
while(1){
char str[] = "";
string ret;
printf("请输入一个中缀表达式:\n");
gets(str);
if(middle_to_postfix(str,ret)){
cout<<ret<<endl;
}else printf("failure!\n");
ret="";
}
return 0;
}
这是c++和c的混合了,因为针对字符串的拼接,字符串和字符的拼接,用c++方便,然后本code主要代码是根据链接文章写的。
针对中缀表达式转后主的核心思想如下图1-1:
图1-1