数据结构实验之栈二:一般算术表达式转换成后缀式(手写栈)

来源:互联网 发布:非网络收音机软件 编辑:程序博客网 时间:2024/05/17 07:39

数据结构实验之栈二:一般算术表达式转换成后缀式

Time Limit: 1000MS Memory limit: 65536K

题目描述

对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。

输入

输入一个算术表达式,以‘#’字符作为结束标志。

输出

输出该表达式转换所得到的后缀式。

示例输入

a*b+(c-d/e)*f#

示例输出

ab*cde/-f*+解析: 其实对于栈的操作,大家更喜欢用stl,但是手写栈也是很重要的,可以让我们了解栈的内部操作;
对于这个题来说不用栈也行,用树的后序遍历更好。
讲一下核心内容:(1)、遇到字母一律输出;
(2)、遇到左括弧一律入栈;
(3)、遇到右括弧就把两个括弧之间的所有符号出栈输出,并且左括弧出栈;
(4)、遇到“+”或“-”,如果栈不空并且栈顶不是左括弧就出栈输出这一个栈顶,“+”或“-”入栈;
(5)、遇到“*”或“/”,如果栈不空并且栈顶不是左括弧并且栈顶是“*”或“/”,就把栈顶出栈输出,“*”或“/”入栈;
这是操作步骤,想问“+”、“-”、“*”、“/”为什么操作不一样,那就是符号优先级的问题了。  ///***********代码
#include <stdio.h>  #include <stdlib.h>  #define maxstact 1000    typedef char elemstack;  typedef struct  {      elemstack *top;      elemstack *base;      int sizestack;  } Sq;  int initstack(Sq &L)  {      L.base=new elemstack[maxstact];      if(!L.base)          exit(0);      L.top=L.base;      L.sizestack=maxstact;  }  int push(Sq &L,char s)  {      if(L.top-L.base>L.sizestack)          return -1;      *(L.top++)=s;      return 0;  }  int pop(Sq &L)  {      if(L.top<=L.base)          return -1;      printf("%c",*(--L.top));  }  int main()  {      Sq L;      char a[1000],*s;      int i;      gets(a);      initstack(L);      for(i=0; a[i]!='#'; i++)      {          switch(a[i])          {          case '(':              push(L,a[i]);              break;          case ')':          {              while(L.top>L.base&&*(L.top-1)!='(')                  pop(L);              L.top--;              break;          }          case '+':          {              if(L.top>L.base&&*(L.top-1)!='(')                  pop(L);              push(L,a[i]);              break;          }          case '-':          {              if(L.top>L.base&&*(L.top-1)!='(')                  pop(L);              push(L,a[i]);              break;          }          case '*':          {              if(L.top>L.base&&*(L.top-1)!='('&&(*(L.top-1)=='*'||*(L.top-1)=='/'))                  pop(L);              push(L,a[i]);              break;          }          case '/':          {              if(L.top>L.base&&*(L.top-1)!='('&&(*(L.top-1)=='*'||*(L.top-1)=='/'))                  pop(L);              push(L,a[i]);              break;          }          default:          {              printf("%c",a[i]);              break;          }          }      }      while(L.top>L.base)      {          pop(L);      }      return 0;  }     

0 0
原创粉丝点击