逆波兰式
#include <stdio.h>
#include <stdlib.h>
typedef struct stack
{
char *top;
int Stacksize;
char *bottom;
}stack;
//初始化栈
void Initstack(stack *name)
{
name->bottom=(char*)malloc(10*sizeof(char));
if(name->bottom==NULL)
{
return ;
}
name->top=name->bottom;
name->Stacksize=10;
}
//入栈
void Push(stack *name,char a)
{
//判断是否为满栈
char *p;
if(name->top-name->bottom==name->Stacksize)
{
p=(char*)realloc(name->bottom,20*sizeof(char));
if(!p)
{
return ;
}
name->bottom=p;
name->top=name->bottom+10;
name->Stacksize=20;
}
*(name->top)=a;
name->top++;
}
//出栈
char pop(stack *name)
{
//判断是否为空栈
if(name->bottom==name->top)
{
return 0;
}
else
{
name->top--;
char c =*(name->top);
return c;
}
}
int main()
{
stack A,B;//A为符号 B为数字加符号
Initstack(&A);
Initstack(&B);
char c;
while(1)
{
c=getchar();
char temp;
if(c=='\n')
{
break;
}
if(c>='a'&&c<='z')
{
Push(&B,c);
}
else
{
if(A.top==A.bottom || c=='(')
{
Push(&A,c);
}
if(c=='+' || c=='-')
{
while(*(A.top-1)=='*'||*(A.top-1)=='/')
{
temp=pop(&A);
Push(&B,temp);
}
Push(&A,c);
}
if(c==')')
{
while(*(A.top-1)!='(')
{
temp=pop(&A);
Push(&B,temp);
}
temp=pop(&A);
}
if(c=='*' || c=='/')
{
Push(&A,c);
}
}
}
while(B.top!=B.bottom)
{
//char pp=pop(&B);
Push(&A,pop(&B));
}
while(A.top!=A.bottom+1)
{
//char qq=pop(&A);
printf("%c",pop(&A));
}
return 0;
}