数据结构 栈(四则表达式)

来源:互联网 发布:小米平板2 ubuntu 编辑:程序博客网 时间:2024/05/23 21:55
#include "stdio.h"#define MAXSIZE 20#define max_size 30typedef 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;}elsereturn false;}bool is_symbol(char c){if(c<='0'||c>='9'){return true;}elsereturn 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);}
/*
自己写的存在一些不足,欢迎拍砖
*/

0 0
原创粉丝点击