#include<stdio.h>
#include<string.h>
#define MAXSIZE 20
typedef struct
{
char data[MAXSIZE];
int top;
}SeqStack;
SeqStack optr, opnd, R;
void change(char s1[30],char s2[30]);
int Priority(char ch);
void SeqStackInit(SeqStack * s)
{// init stack
s->top = -1;
}
void SeqStackPush(SeqStack * s , char x)
{ // push stack
if(s->top == MAXSIZE-1)
{
printf("栈满/n");
}
s->top++;
s->data[s->top] = x;
}
char SeqStackPop(SeqStack *s)
{// pop stack
char x;
if(s->top == -1)
{
printf("空栈/n");
return -1;
}
x = s->data[s->top];
s->top--;
return x;
}
char SeqStackGetTop(SeqStack *s)
{
return s->data[s->top];
}
char precede(char c1,char c2)
{
int tag1,tag2; //优先级标签
if(c1=='(' && c2 ==')') return '='; //栈定和读到的符号都是括号;
switch(c1)
{
case '(': return '<'; //栈顶是'(',下个读到的符号入栈;
case '*':
case '/': tag1 = 1; break;
case '+':
case '-': tag1 = 0; break;
case '#': return '<'; //栈顶为'#',入栈
default : break;
}
switch(c2)
{
case '(': return '<'; // ch = '(',入栈;
case ')': return '>'; // ch = ')', 出栈计算;
case '*':
case '/': tag2 = 1; break;
case '+':
case '-': tag2 = 0; break;
case '#' : return '>'; // ch='#'多项式结束
default : break;
}
if(tag1 >= tag2) return '>';
else return '<';
}
char operate(char a,char t, char b)
{
int n,m;
n = a - 48;
m = b - 48;
switch(t)
{
case '+': n = m + n; break;
case '-': n = n - m; break;
case '*': n = m * n; break;
case '/': n = n / m; break;
default: break;
}
return n+48; //数字转字符串 ;
}
void main(void)
{
char ch,theta,a,b,s1[30],s2[30];
int n;
static int i=0;
SeqStackInit(&optr); //符号栈
SeqStackPush(&optr, '#');
SeqStackInit(&opnd); // 数值栈
printf("请输入一个多项式,结尾以'#'号标示:/n");
ch = getchar();
s1[i] = ch;
while( !((ch == '#') && ( SeqStackGetTop(&optr) == '#')))
{
if(ch >= '0' && ch <= '9')
{
SeqStackPush(&opnd,ch);
ch = getchar();
s1[++i] = ch;
}
else switch(precede(SeqStackGetTop(&optr),ch))
{
case '<' : SeqStackPush(&optr,ch);
ch = getchar();
s1[++i] = ch;
break;
case '=' : SeqStackPop(&optr);
ch = getchar();
s1[++i] = ch;
break;
case '>' : theta = SeqStackPop(&optr);
b = SeqStackPop(&opnd);
a = SeqStackPop(&opnd);
SeqStackPush(&opnd,operate(a, theta, b));
break;
}
}
n = SeqStackGetTop(&opnd) - 48;
printf("运算结果为:%d /n",n);
s1[i]='/0';
printf("中缀表达式:/t%s/n",s1);
change(s1,s2);
printf("后缀表达式:/t%s/n",s2);
}
void change(char s1[30],char s2[30])
{
int i=0,j=0;
char ch,temp;
SeqStackInit(&R);
SeqStackPush(&R, '#');
while(s1[i]!='/0')
{
if('0'<s1[i] && s1[i]<'9')
{
s2[j]=s1[i]; j++;
}
else if(s1[i]=='(')
SeqStackPush(&R, s1[i]);
else if(s1[i]==')')
{
ch = SeqStackPop(&R); // 取得栈顶操作符
while(ch != '(') // 直到弹出左括号
{
s2[j] = ch;
ch = SeqStackPop(&R);
j++;
}
}
else {
ch=SeqStackGetTop(&R);
if(Priority(ch)==2) SeqStackPush(&R, s1[i]);
else if(Priority(ch)<Priority(s1[i])) SeqStackPush(&R, s1[i]);
else{
s2[j++] = SeqStackPop(&R);
ch = SeqStackGetTop(&R);
while( ch!='#' && Priority(ch) < Priority(s1[i]))
{
s2[j++] = SeqStackPop(&R);
ch = SeqStackGetTop(&R);
}
SeqStackPush(&R, s1[i]);
}
}
i++;
}
ch =SeqStackGetTop(&R);
while('#'!=ch ){
s2[j++] = ch;
ch = SeqStackPop(&R);
ch = SeqStackGetTop(&R);
}
s2[j++]='/0';
}
int Priority(char ch)
{
int tag;
switch(ch)
{
case '-':tag = 0; break;
case '+':tag = 0; break;
case '*':tag = 1; break;
case '/':tag = 1; break;
case '#':tag = 2; break;
}
return tag;
}