#include "stdio.h"
#define MAXSIZE 20
#define max_size 30
typedef struct
{
int data[MAXSIZE];
int top;
}NumberStack,*pNumberStack;//数字栈
typedef struct
{
char data[MAXSIZE];
int top;
}SymbolStack,*pSymbolStack;//符号栈
void Init_Number(pNumberStack S); //初始化数字栈
void Init_Symbol(pSymbolStack S); //初始化符号栈
bool Push_Number(pNumberStack S,int val); //进栈
bool Push_Symbol(pSymbolStack S,char val);//进栈
bool Pop_Number(pNumberStack S,int *pVal);//出栈
bool Pop_Symbol(pSymbolStack S,char *pVal);//出栈
bool Get_Number(pNumberStack S,int *pVal);//得到栈顶元素
bool Get_Symbol(pSymbolStack S,int *pVal); //得到栈顶元素
bool is_number(char c);//当前字符是否为数字
bool is_symbol(char c);//当前字符是否为符号
int Priority(char c)
{
if(c=='*'||c=='/'||c=='%')
{
return 2;
}
else {
return 1;
}
}
void Init_Number(pNumberStack S)
{
S->top = -1;
}
void Init_Symbol(pSymbolStack S)
{
S->top = -1;
}
bool Push_Number(pNumberStack S,int val)
{
if(S->top == MAXSIZE-1)
{
return false;
}
else
{
S->data[++S->top] = val;
return true;
}
}
bool Push_Symbol(pSymbolStack S,char val)
{
if(S->top == MAXSIZE-1)
{
return false;
}
else
{
S->data[++S->top] = val;
return true;
}
}
bool Pop_Number(pNumberStack S,int *pVal)
{
if(S->top == -1)
{
return false;
}
else
{
*pVal = S->data[S->top--];
return true;
}
}
bool Pop_Symbol(pSymbolStack S,char *pVal)
{
if(S->top == -1)
{
return false;
}
else
{
*pVal = S->data[S->top--];
return true;
}
}
bool Get_Number(pNumberStack S,int *pVal)
{
if(S->top == -1)
{
return false;
}
else
{
*pVal = S->data[S->top];
return true;
}
}
bool Get_Symbol(pSymbolStack S,char *pVal)
{
if(S->top == -1)
{
return false;
}
else
{
*pVal = S->data[S->top];
return true;
}
}
bool is_number(char c)
{
if(c>='0'&&c<='9')
{
return true;
}
else
return false;
}
bool is_symbol(char c)
{
if(c<='0'||c>='9')
{
return true;
}
else
return false;
}
void main()
{
SymbolStack symbolStack;
Init_Symbol(&symbolStack);
int i=0, j=0;
char cval;//用来取得栈顶元素
char s[max_size]="9+2*5-2+(3+2-2*2)*3+8/2-4/2+8";
char s2[max_size];//保存后缀表达式
/*
*将中缀表达式转换为后缀表达式
*/
while(i<max_size-1)
{
if(is_number(s[i]))//是数字
{
s2[j++]=s[i];//保存数字
}
else//不是数字
{
if(symbolStack.top==-1)//栈空,
{
Push_Symbol(&symbolStack,s[i]); //直接进栈
}
else //栈不空
{
if(s[i]!=')') //当前字符不为 )
{
if(s[i]=='(') //当前字符为 ( 则直接进栈
{
Push_Symbol(&symbolStack,s[i]);
}
else //当前字符不为 (或 )
{
Get_Symbol(&symbolStack,&cval);//得到栈顶元素
if(cval =='(') //栈顶元素是 ( 则直接进站
{
Push_Symbol(&symbolStack,s[i]);
}
else
{
if(Priority(cval)<Priority(s[i])) //进行优先级比较 当前元素大于栈顶元素直接进站
{
Push_Symbol(&symbolStack,s[i]);
}else //否则出栈
{
Pop_Symbol(&symbolStack,&cval);
s2[j++]=cval;
Get_Symbol(&symbolStack,&cval);//得到栈顶元素
//注:出栈后还要判断当前栈顶是否和当前元素等级大,或者相同,则还要继续出栈。
while(Priority(cval)>=Priority(s[i])&&symbolStack.top!=-1&&cval!='(')
{
Pop_Symbol(&symbolStack,&cval);
s2[j++]=cval;
Get_Symbol(&symbolStack,&cval);//得到栈顶元素
}
//栈内元素出完栈之后,当前元素进栈
Push_Symbol(&symbolStack,s[i]);
}
}
}
}
else //s[i]是)则出栈
{
Get_Symbol(&symbolStack,&cval);
while (cval !='(')//出栈一直到栈顶元素为(
{
Pop_Symbol(&symbolStack,&cval);
// printf("出栈元素:%c\n",cval);
s2[j++]=cval;
Get_Symbol(&symbolStack,&cval);
}
// 让栈顶元素(也出栈 ,但不保存
Pop_Symbol(&symbolStack,&cval);
}
}
}
i++;
}
while(symbolStack.top!=-1)
{
Pop_Symbol(&symbolStack,&cval);
s2[j]=cval;
j++;
}
//打印后缀表达式
printf("后缀表达式:(%s)\n",s2);
/***
对后缀表达式进行操作
*****/
//定义并初始化数字栈
NumberStack numberStack;
Init_Number(&numberStack);
int number1,number2;//用来保存出栈的元素
int result;//保存出栈元素操作之后的值
i=0;
while(i<max_size-1)
{
if(is_number(s2[i]))
{
Push_Number(&numberStack,s2[i]-'0');//将字符转换成数字进栈
}
else
{
Pop_Number(&numberStack,&number2);
Pop_Number(&numberStack,&number1);
switch(s2[i])
{
case '+': result = number1+number2;break;
case '-': result = number1-number2;break;
case '*': result = number1*number2;break;
case '/': result = number1/number2;break;
case '%': result = number1%number2;break;
}
Push_Number(&numberStack,result);
}
i++;
}
Pop_Number(&numberStack,&result);
printf("%s=%d\n",s,result);
}
/*
自己写的存在一些不足,欢迎拍砖
*/