刚开始接触逆波兰表达式,自己百度了很多资料才了解到逆波兰表达式究竟是怎么回事,感觉逆波兰表达式比普通表达式进行运算相对于计算机而言要简单很多,但是毕竟刚接触它,所以感觉也挺难的,将一般表达式转化为逆波兰表达式主要是在运算符方面要很仔细,清楚自己接下来要怎样做,
逆波兰表达式的转化步骤:
1.首先可以写一个判断运算符优先级的函数,为了便于后面判断优先级来存放元素.
2.定义两个数组分别存储原表达式和逆波兰表达式,再定义一个中间栈进行原表达式转化为逆波兰表达式的操作,手动输入原表达式.
3.然后遍历原表达式数组,如果是左括号,直接入栈,如果是右括号,则把栈中元素出栈,并存到逆波兰表达式的数组中,直到遇到第一个左括号为止,左括号不存到数组中,但是也要出栈.
4.如果是普通字符(加减乘除),用此字符与栈顶元素的优先级比较,如果比栈顶元素高,则入栈,如果低,则将栈顶元素出栈并存到逆波兰数组中,直到栈为空或者遇到比它低的元素停止.
5.最后判断栈是否为空,如果不为空,则把栈中元素出栈存到逆波兰数组中.直到栈为空.
---------------------------------------------------------------------------------------------------------------------------------
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define MAX 100
int youxian(char ch) //判断运算符的优先级
{
int i;
switch(ch)
{
case'(': i=1; break;
case'+': i=2; break;
case'-': i=2; break;
case'*': i=3; break;
case'/': i=3; break;
case')': i=4; break;
}
return i;
}
int main() //将普通表达式转化为逆波兰表达式
{
char str[MAX]; //定义数组存储普通表达式
char ex[MAX]; //存储逆波兰表达式
char stack[MAX]; //当作栈使用
int sum,i=0,t=0,top=0,m=0;
char ch;
printf("please input the string:\n");
printf("please end of #!\n");
do //输入表达式
{
i++;
scanf("%c",&str[i]);
}while(str[i]!='#'&&i<MAX);
sum=i-1;
for(i=1;i<=sum;i++) //原表达式转化为逆波兰式
{
ch=str[i];
if(ch!='#')
{
switch(ch)
{
case'(': //如果为左括号
stack[++top]=ch;
m++;
break;
case')': //如果为右括号
while(stack[top]!='(')
{
ex[++t]=stack[top];
top--;
}
top--;
break;
case'+':
case'-': //如果为加号减号乘号除号
case'*':
case'/':
if(top==0)
stack[++top]=ch;
else
{
if(youxian(stack[top])<youxian(ch))
{
stack[++top]=ch;
}
else
{
printf("\n%d\n",top);
while(top!=0&&youxian(stack[top])>=youxian(ch))
{
ex[++t]=stack[top];
top--;
}
}
}
break;
default:
if(ch>='0'&&ch<='9')
ex[++t]=ch;
break;
}
}
}
while(top!=0)
{
ex[++t]=stack[top--];
printf("%c",ex[t]);
}
printf("原表达式为:");
for(i=1;i<=sum;i++)
{
printf("%c",str[i]);
}
printf("\n");
printf("转化为逆波兰式为: ");
for(i=1;i<=sum-m;i++)
printf("%c",ex[i]);
printf("\n");
return 0;
}