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

匿名 (未验证) 提交于 2019-12-02 22:56:40

数据结构实验之栈与队列二:一般算术表达式转换成后缀式
Time Limit: 1000 ms Memory Limit: 65536 KiB

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

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

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

Sample Input
a*b+(c-d/e)*f#
Sample Output
ab*cde/-f*+
Hint
Source

#include <stdio.h> #include <stdlib.h>  char s[100005]; //分配栈的大小 int main() {     int top=0;     char a;     while(scanf("%c",&a))     {         if(a=='#')         break;         else if(a>='a'&&a<='z')             printf("%c",a); //字母直接输出         else if(a=='(')             s[++top]=a;  //左括号直接进栈         else if(a==')')         {             for(;s[top]!='(';top--)                 printf("%c",s[top]); //讲括号中元素弹出栈             top--; //'('弹出栈         }         else if(a=='+'||a=='-')         {             while(1)             {                 if(top==0||s[top]=='(')                 {                     s[++top]=a;                     break;                 }                 printf("%c",s[top--]); //若待压栈的操作符比栈顶操作符优先级高,则直接压栈,否则将栈顶元素出栈,再接着比较继续和栈顶元素的优先级.             }         }         else if(a=='*'||a=='/')         {             while(1)             {                 if(s[top]=='+'||s[top]=='-'||s[top]=='('||top==0)                 {                     s[++top]=a;                     break;                 }                 printf("%c",s[top--]); //若待压栈的操作符比栈顶操作符优先级高,则直接压栈,否则将栈顶元素出栈,再接着比较继续和栈顶元素的优先级.             }         }     }     for(;top>0;top--)             printf("%c",s[top]); //弹出栈中剩余元素     return 0; } 

中缀表达式转化为后缀表达式步骤:
一.左到右遍历,遇到字母直接输出;
二.遇到操作符:
1.若栈为空或栈顶元素为‘(’或‘(’还未找到‘)’,则直接压栈.
2.若栈顶元素为普通操作符,则比较优先级,若待压栈的操作符比栈顶操作符优先级高,则直接压栈,否则将栈顶元素出栈,再接着比较继续和栈顶元素的优先级.
3.若遇到),则依次弹出栈顶的运算符,直到遇到(为止,此时将这一对括号丢弃.
4. 最后将栈中剩余的运算符依次弹出栈.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!