仅供参考仅供参考,因为求逆波兰式一定会比较优先级这里只有+-*/但C库里我只知道strcmp函数而它根据ASCII比较大小返回值,但在ASCII里*:42 ;+:43 ;-:45 ;/:47 。所以只能按照这个优先级排序。(Dev c++运行的)
#include <stdio.h>
#include <ctype.h>
#include <string.h> //strcmp函数
#define TRUE 1
#define FALSE 0
#define SIZE 50
typedef struct
{
char elem[SIZE];
int top;
}Seq;
Seq OPS;
void InitStack(Seq *S) //初始化空栈
{
S->top=-1;
}
void Push(Seq *S,char x) //入栈函数
{
if(S->top==SIZE-1)
{
printf("栈已满无法插入。");
}
else
{
S->top++;
S->elem[S->top]=x;
}
}
void Pop(Seq *S,char *x) //出栈
{
if(S->top==-1)
printf("栈已空,无法出栈。");
else
{
*x=S->elem[S->top];
S->top--;
}
}
void GetTop(Seq *S,char *x) //取栈顶元素
{
if(S->top==-1)
printf("栈已空无法出栈.");
else
{
*x=S->elem[S->top];
}
}
void mbin(void)
{
char op[50]; //储存自己的输入和出栈的符号最后一起输出
int i=0,v; //i:计数器 记录共有几个元素
char c; //c储存自己的输入
char *q,*a,*f; //三个指针变量分别是储存取的栈顶的地址,储存出栈元素的地址,输入(c)的地址
char m,n;
q=&m;
a=&n;
f=&c;
InitStack(&OPS);
Push(&OPS,'#');
printf("请按顺序输入表达式的一个字符输入#表示结束:\n");
c=getchar();
GetTop(&OPS,q);
while(c!='#')
{
if(isalpha(c)) //判断是否为字母的函数,头文件是ctype.h
{
op[i]=c;
i++;
scanf(" %c",&c);
}
else
{
GetTop(&OPS,q);
int t,u;
t=strcmp(f,q);
if(t<=0)
{
u=0;
}
else u=1;
switch(u)
{
case 1:
Push(&OPS,c);
scanf(" %c",&c);break;
case 0:
Pop(&OPS,a);
op[i]=n;
i++;
break;
}
}
}
while(OPS.top>=0) //出第一个while循环运算符栈不一定空,这里为了把运算符栈里的运算符取出来
{
Pop(&OPS,a);
op[i]=n;
i++;
}
v=i;
for(i=0;i<=v;i++)
{
printf("%c",op[i]);
}
}
int main(void)
{
mbin();
return 0;
}