利用栈来实现的。
/***************************************** Copyright (c) 2015 Jingshuang Hu @filename:demo.c @datetime:2015.10.08 @author:HJS @e-mail:eleftheria@163.com @blog:http://blog.csdn.net/hujingshuang *****************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> /***********************************************/ #define MAX_LENGTH 20 /***********************************************/ typedef struct { char data[MAX_LENGTH]; int top; }SqStack; /***********************************************/ int Express_Error(char *p);//违法输入判断 SqStack Infix_suffix(char *p);//中缀转后缀 char Symbol_Priority(char ch);//优先级 int calc_suffix(SqStack p);//计算后缀表达式 char calc_two(char p1, char p2, char symbol);//两个元素之间的四则运算 void change(char *p);//转换一下 void Stack_Init(SqStack *p);//栈初始化 void Stack_Push(SqStack *p, char value);//入栈 char Stack_Pop(SqStack *p);//出栈 char Stack_Top(SqStack p);//取栈顶元素 int Stack_Length(SqStack p);//栈长 int Stack_Empty(SqStack p);//栈空 void Stack_ShowAll(SqStack p);//查看栈中元素 void Stack_Clear(SqStack *p);//清空栈 /***********************************************/ //8+(3+5-2)*2 = 20 //7+(6-1)*2+9/3 = 20 //((20/5-3)+4)*2/5 = 2 //((30-10/2)+5)/10*2/3-1 = 1 //(3+2*(12+4)/4-2)/3+2 = 5 int main() { int choise = 0; char str[MAX_LENGTH]; SqStack s; while(1) { printf("中缀表达式:"); gets(str); if (Express_Error(str))//表达式不合法,重新输入 { printf("表达是不合法,请重新输入!\n"); continue; } change(str);//提取字符串中的数字并凑整 s = Infix_suffix(str);//中缀转后缀 printf("后缀表达式:"); puts(s.data); printf("结果:%d", calc_suffix(s)); getchar();getchar(); system("cls"); } return 0; } /***********************************************/ void change(char *p)//转换一下 { int i = 0, j = 0, sum = 0; char *s = p; while(p[i] != '\0') { if ((p[i] >= '0') && (p[i] <= '9')) { sum = sum * 10 + p[i] - '0'; if ((p[i + 1] > '9') || (p[i + 1] < '0')) { s[j] = sum + '0'; sum = 0; j++; } } else { s[j] = p[i]; j++; } i++; } s[j] = '\0'; p = s; } /***********************************************/ SqStack Infix_suffix(char *p)//中缀转后缀 { char i = 0, pt = 0, pc = 0;//优先级的栈顶、当前优先级 char st = 0, sc = 0;//符号的栈顶、当前符号 SqStack s;//优先级栈、符号栈、后缀表达式栈 SqStack s1; SqStack s2; Stack_Init(&s); Stack_Init(&s1); Stack_Init(&s2); // while(p[i] != '\0') { if ((p[i] != '+') && (p[i] != '-') && (p[i] != '*') && (p[i] != '/') && (p[i] != '%') && (p[i] !='(') && (p[i] != ')'))//数字直接入栈到s2 { Stack_Push(&s2, p[i]); } else//符号入栈s1,其优先级入栈s(s与s1同步) { pc = Symbol_Priority(p[i]);//当前优符号的先级 if (Stack_Empty(s1) || ('(' == p[i]))//s1栈空或'('则直接入栈 { Stack_Push(&s, pc);//优先级入栈 Stack_Push(&s1, p[i]);//符号入栈 } else { pt = Stack_Top(s);//优先级的栈顶 st = Stack_Top(s1);//符号的栈顶 if (')' == p[i]) { while(st != '(') { Stack_Pop(&s);//优先级s出栈 Stack_Push(&s2, Stack_Pop(&s1));//符号出栈s1,并入栈到s2 st = Stack_Top(s1); } Stack_Pop(&s);//将'('的优先级出栈 Stack_Pop(&s1);//将'('出栈 } else//根据优先级来判断出入栈 { if (pc > pt)//优先级:当前符号>栈顶符号,直接入栈 { Stack_Push(&s, pc);//优先级入栈 Stack_Push(&s1, p[i]);//符号入栈 } else//优先级:当前符号<=栈顶符号,出栈,直到栈空或遇到'(',停止出栈 { while((!Stack_Empty(s1)) && (Stack_Top(s1) != '(') && (Stack_Top(s) >= pc)) { Stack_Push(&s2, Stack_Pop(&s1)); Stack_Pop(&s); } Stack_Push(&s1, p[i]); Stack_Push(&s, pc); } } } } i++; } while(!Stack_Empty(s1))//将s1中剩余符号出栈,并入栈到s2 { Stack_Push(&s2, Stack_Pop(&s1)); Stack_Pop(&s); } Stack_Push(&s2, '\0');//入栈'\0',搞成字符串 return s2; } /***********************************************/ int calc_suffix(SqStack p)//计算后缀表达式 { int i = 0; char *str = p.data; char p1, p2; SqStack s; Stack_Init(&s); while(str[i] != '\0') { if ((str[i] != '+') && (str[i] != '-') && (str[i] != '*') && (str[i] != '/') && (str[i] != '%'))//如果是数字则直接入栈 { Stack_Push(&s, str[i]); } else//如果是符号,则出栈两个数字进行运算 { p2 = Stack_Pop(&s); p1 = Stack_Pop(&s); Stack_Push(&s, calc_two(p1, p2, str[i])); } i++; } // Stack_Push(&s, '\0'); return (Stack_Pop(&s) - '0');//栈中最后一个数就是结果,将其出栈 } /***********************************************/ char calc_two(char p1, char p2, char symbol)//两个元素之间的四则运算 { char res = 0; switch(symbol) { case '+': res = (p1 - '0') + (p2 - '0'); break; case '-': res = (p1 - '0') - (p2 - '0'); break; case '*': res = (p1 - '0') * (p2 - '0'); break; case '/': res = (p1 - '0') / (p2 - '0'); break; case '%': res = (p1 - '0') % (p2 - '0'); break; default: break; } return (res + '0'); } /***********************************************/ int Express_Error(char *p)//违法输入判断 { int i = 0, flag = 0; while((p[i] != '\0') && (flag == 0)) { if (((p[i] >= '0') && (p[i] <= '9')) || ('+' == p[i]) || ('-' == p[i]) || ('*' == p[i]) || ('/' == p[i]) || ('(' == p[i]) || (')' == p[i])) { flag = 0; } else { flag = 1; } i++; } return flag; } /***********************************************/ char Symbol_Priority(char ch)//优先级 { if (('+' == ch) || ('-' == ch)) { return 0; } else if (('*' == ch) || ('/' == ch) || ('%' == ch)) { return 1; } else if (('(' == ch) || (')' == ch)) { return 2; } else { return 3;//错误代码 } } /***********************************************/ void Stack_Init(SqStack *p)//栈初始化 { p->top = -1; } /***********************************************/ void Stack_Push(SqStack *p, char value)//入栈 { p->top++; p->data[p->top] = value; } /***********************************************/ char Stack_Pop(SqStack *p)//出栈 { return p->data[p->top--]; } /***********************************************/ char Stack_Top(SqStack p)//栈顶 { return p.data[p.top]; } /***********************************************/ int Stack_Length(SqStack p)//栈长 { return p.top; } /***********************************************/ int Stack_Empty(SqStack p)//1栈空 0非空 { return (p.top <= -1) ? 1 : 0; } /***********************************************/ void Stack_ShowAll(SqStack p)//查看栈中元素 { char ch; while(!Stack_Empty(p)) { ch = Stack_Pop(&p); printf("%c", ch); } printf("\n"); } /***********************************************/ void Stack_Clear(SqStack *p)//清空栈 { p->top = -1; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/hujingshuang/article/details/49679579