数据结构与算法(9)--后缀表达式

来源:互联网 发布:数据监测系统那里有 编辑:程序博客网 时间:2024/05/08 21:31

后缀表达式的特点就是计算机运算非常方便,需要用到栈;计算机处理过程只需要顺序读入,如果遇到数字,则放入栈中,如果是运算符,则将两个栈中数字取出进行运算;

比如1+2的后缀表达式为12+;

而栈可以把一般的中缀表达式变成后缀表达式,并且计算后缀表达式得出结果,因此此应用在计算器中非常常用。

把中缀表达式转换成后缀表达式需要循几个规则:

(1)如果读入操作数,则直接放入输出字符串。

(2)如果读入一般运算符如+-*/,则放入堆栈,但是放入堆栈之前必须要检查栈顶,并确定栈顶运算符的优先级比放入的运算符的优先级低;如果放入的优先级较低,则需要将栈顶的运算符放入输出字符串。

(3)如果读入(,因为左括号优先级最高,因此放入栈中,但是注意,当左括号放入栈中后,则优先级最低。

(4)如果读入),则将栈中运算符取出放入输出字符串,直到取出(为止,注意:()不输出到输出字符串。

(5)顺序读完表达式,如果栈中还有操作符,则弹出,并放入输出字符串。

计算后缀表达式需要遵循以下几个规则:

(1)如果是操作数,则放入栈中。

(2)如果是操作符,则取出栈中两个操作数,进行运算后,将结果放入栈中。

(3)直到最后栈中只有一个元素,此元素就是计算结果。

#include <stdio.h>#include <math.h>#define MAXSIZE 100int 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;}

—————————————————————————————————

本文原创自Sliencecsdn技术博客。

本博客所有原创文章请以链接形式注明出处。

欢迎关注本技术博客,本博客的文章会不定期更新。


大多数人想要改造这个世界,但却罕有人想改造自己。

世上没有绝望的处境,只有对处境绝望的人。

                                              ————By slience

—————————————————————————————————


0 0