逆波兰式
#include
#include
typedef struct st
{
int maxsize;
int top;
int *pstack;
}stack;
void creatstack(stack *s,int ms);
void push(stack *s, int x); int pop(stack *s);
void clearstack(stack *s); char readstack(stack *s); int priority(char ch); void transform(char a[],char b[]);
int main()
{
char a[80],b[200];
printf("请输入中缀表达式:");
gets(a);
transform(a,b);
printf("输出地后缀表达式:");
puts(b);
getchar();
return 0;
}
void creatstack(stack *s,int ms)
{
s->maxsize = ms;
s->top = -1;
s->pstack = (int *)malloc(ms*sizeof(int));
s->pstack[++s->top] = '@';
//这里@被假定为优先级最低的运算符
}
void push(stack *s, int x)//入栈
{
if(s->top < s->maxsize-1)
s->pstack[++s->top] = x;
}
int pop(stack *s)//出栈
{
if(s->top != -1)
return s->pstack[s->top--];
}
char readstack(stack *s)
{
return(s->pstack[s->top]);
}
int priority(char ch)//优先级设置 {
int flag = 0;
switch(ch)
{
case '+':
case '-':
flag = 1;
break;
case'*':
case'/':
flag = 2;
break;
default:
flag = 0;
break;
}
return flag;
}
void transform(char a[],char b[])//转换 {
stack s;
int i = 0,j = 0;
creatstack(&s,20);
while(a[i])
{
if(a[i] >= '0' && a[i] <= '9')
{
b[j++] = a[i];
}
else if(a[i] == '(')
push(&s,a[i]);
else if(a[i] == ')')
{
b[j++] = ' ';
while(readstack(&s) != '(')
{
b[j++] = pop(&s);
b[j++] = ' ';
}
}
else
{
b[j++] = ' ';
while(priority(a[i]) <= priority(readstack(&s)))
{
b[j++] = pop(&s);
b[j++] = ' ';
}
push(&s, a[i]);
}
i++;
}
while(s.top != 0)//如果判断a[]结束,栈中还有运算符则出栈到b[]中
{
b[j++] = ' ';
b[j++] = pop(&s);
}
b[j++] = '\0';//将b转换为字符
}
void clearstack(stack *s) {
s->maxsize = 0;
s->top = -1;
free(s->pstack);
s->pstack = 0;
}