后缀表达式的特点就是计算机运算非常方便,需要用到栈;计算机处理过程只需要顺序读入,如果遇到数字,则放入栈中,如果是运算符,则将两个栈中数字取出进行运算;
比如1+2的后缀表达式为12+;
而栈可以把一般的中缀表达式变成后缀表达式,并且计算后缀表达式得出结果,因此此应用在计算器中非常常用。
把中缀表达式转换成后缀表达式需要循几个规则:
(1)如果读入操作数,则直接放入输出字符串。
(2)如果读入一般运算符如+-*/,则放入堆栈,但是放入堆栈之前必须要检查栈顶,并确定栈顶运算符的优先级比放入的运算符的优先级低;如果放入的优先级较低,则需要将栈顶的运算符放入输出字符串。
(3)如果读入(,因为左括号优先级最高,因此放入栈中,但是注意,当左括号放入栈中后,则优先级最低。
(4)如果读入),则将栈中运算符取出放入输出字符串,直到取出(为止,注意:()不输出到输出字符串。
(5)顺序读完表达式,如果栈中还有操作符,则弹出,并放入输出字符串。
计算后缀表达式需要遵循以下几个规则:
(1)如果是操作数,则放入栈中。
(2)如果是操作符,则取出栈中两个操作数,进行运算后,将结果放入栈中。
(3)直到最后栈中只有一个元素,此元素就是计算结果。
#include <stdio.h>
#include <math.h>
#define MAXSIZE 100
int IsOperator(char ch)
{
switch(ch)
{
case '^':
case '*':
case '/':
case '%':
case '+':
case '-':
return 1;
default:
return 0;
}
}
void calc(char *pArr, int *pResult)
{
int data[MAXSIZE];
int top = -1;
char ch;
int x, y;
if(pArr==NULL || pResult==NULL)
return;
while((ch=*pArr++) != '#')
{
if(!IsOperator(ch))
{
data[++top] = (int)(ch-48);
}
else
{
y = data[top--];
x = data[top--];
switch(ch)
{
case '^':
x = pow(x, y);
break;
case '*':
x = x*y;
break;
case '/':
x = x/y;
break;
case '%':
x = x%y;
break;
case '+':
x = x+y;
break;
case '-':
x = x-y;
break;
default:
;
}
data[++top] = x;
}
}
*pResult = data[top--];
}
int main()
{
char arr[] = "32422*+13*-^*5-#";
int x;
calc(arr, &x);
printf("The result is %d\n", x);
return 0;
}
—————————————————————————————————
本文原创自Slience的csdn技术博客。
本博客所有原创文章请以链接形式注明出处。
欢迎关注本技术博客,本博客的文章会不定期更新。
大多数人想要改造这个世界,但却罕有人想改造自己。
世上没有绝望的处境,只有对处境绝望的人。
————By slience
—————————————————————————————————