转自:https://www.cnblogs.com/yuxiaoba/p/8399934.html

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

输入格式:

输入在一行中给出不含空格的中缀表达式,可包含+-*\以及左右括号(),表达式不超过20个字符。

输出格式:

在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。

输入样例:

2+3*(7-4)+8/4

输出样例:

2 3 7 4 - * + 8 4 / +

解题思路
将中缀表达式转换为后缀表达式遵循以下步骤:
(1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
(2) 从左至右扫描中缀表达式;
(3) 遇到操作数时,将其压入S2;
(4) 遇到运算符时,比较其与S1栈顶运算符的优先级:
(4-1) 如果S1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
(4-2) 否则,若优先级比栈顶运算符的高,也将运算符压入S1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况);
(4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较;
(5) 遇到括号时:
(5-1) 如果是左括号“(”,则直接压入S1;
(5-2) 如果是右括号“)”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到左括号为止,此时将这一对括号丢弃;
(6) 重复步骤(2)至(5),直到表达式的最右边;
(7) 将S1中剩余的运算符依次弹出并压入S2;
(8) 依次弹出S2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式

#include<stdio.h>
#include<stdlib.h>
#include<string.h> int IsNum( char c);
int IsZhengfu( char c);
int Compare( char a, char b); int main()
{
char str1[];
char str2[];
int len;
int flag =; //表示str2是否为空
int i,j;
int space =; scanf("%s",str1);
len = strlen(str1); for( i=; i<len; i++)
{
if(IsNum(str1[i]))
{
//str1[i]是数字则输出
if( space )
{
printf(" ");
space = ;
}
printf("%c",str1[i]);
}
else if( IsZhengfu(str1[i]) && (i? !IsNum(str1[i-]) && str1[i-]!=')':))
{
//若第一个符号是负号或者出现连续两个符号
if( str1[i]=='-')
{
if(space)
{
printf(" ");
space = ;
}
printf("%c",str1[i]);
}
}
else
{
//其他符号
if( flag)
{
if( str1[i]==')')
{
//str2出栈直至遇到(
while( flag--)
{
if(str2[flag]=='(') break;
printf(" %c",str2[flag]);
}
}
else
{
while( flag )
{
//str2内不为空,比较栈顶与str1[i]的优先级
if( Compare( str2[flag-],str1[i]))
{
//若str1优先级低,出栈
printf(" %c",str2[--flag]);
}
else break;
}
str2[flag++] = str1[i];
}
}
else str2[flag++] = str1[i];
for ( j=; j<flag; j++)
{
if( str2[j]!='(')
{
//遇见‘(’不输出空格
space = ;
break;
}
}
}
}
while (flag)
{
printf(" %c",str2[--flag]);
} return ;
} int IsNum( char c)
{
//c是数字,注意题目数据会有小数
return ( c >=''&&c<='')||c=='.';
} int IsZhengfu( char c)
{
return c=='+' || c=='-';
} int Compare( char a, char b)
{
//比较两个符号优先级
//连续的两个case语句表示这两个case是同一种情况
if( b==')') return ;
if( b=='(' || a=='(') return ; switch(b)
{
case '+':
case '-':
return ;
case '*':
case '/':
switch(a)
{
case '+':
case '-':
return ;
case '*':
case '/':
return ;
} }
}

PTA 7-20 表达式转换的更多相关文章

  1. 计算器类(C++&JAVA——表达式转换、运算、模板公式)

    运行: (a+b)*c 后缀表达式:ab+c* 赋值: Enter the a : 10 Enter the b : 3 Enter the c : 5 结果为:65 代码是我从的逻辑判断系统改过来的 ...

  2. ZH奶酪:Python 中缀表达式转换后缀表达式

    实现一个可以处理加减乘数运算的中缀表达式转换后缀表达式的程序: 一个输入中缀表达式inOrder 一个输出池pool 一个缓存栈stack 从前至后逐字读取inOrder 首先看一下不包含括号的: ( ...

  3. lambda表达式转换sql

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; usin ...

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

    数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...

  5. 3-06. 表达式转换(25)(中缀表达式转后缀表达式ZJU_PAT)

    题目链接:http://pat.zju.edu.cn/contests/ds/3-06 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式. 日常使用的算术表达式是採用中缀表示法,即二元运算符位于两 ...

  6. Linq to Entity经验:表达式转换

    http://www.cnblogs.com/ASPNET2008/archive/2012/10/27/2742434.html 最近一年的项目,我主要负责一些小型项目(就是指企业内部的小项目),在 ...

  7. 第五周PTA笔记 后缀表达式+后缀表达式计算

    后缀表达式 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右进行(不用考虑运算符的优先级). 如:中缀表达式 3(5–2 ...

  8. php中将url中的参数含有%20进行转换或解码

    我的url: .......index.php?action=search&start=12&search=star wave&orderby=categories&s ...

  9. JDK8 Lamdba表达式转换成Map,value为null问题

    // 将list转换成Map类型 Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getI ...

随机推荐

  1. 算法复习-P NP NPC NP-hard概念

    from http://blog.csdn.net/huang1024rui/article/details/49154507 P.NP.NPC和NP-Hard相关概念的图形和解释 一.相关概念 P: ...

  2. vue的组件创建和使用

    首先说一下vue组件 什么是组件? 在我的理解,vue的所有页面内容都是组件. 什么是父子组件? 因为所有的页面内容都是组件,那么怎么区分父子组件呢?其实很简单,现在有一个页面,在js里面的 comp ...

  3. Python前端HTML

    一.web标准介绍 web标准: w3c:万维网联盟组织,用来制定web标准的机构(组织) web标准:制作网页遵循的规范 web标准规范的分类:结构标准.表现标准.行为标准. 结构:html.表示: ...

  4. jquery attribute选择器 语法

    jquery attribute选择器 语法 作用:[attribute] 选择每个带有指定属性的元素.可以选取带有任何属性的元素(对于指定的属性没有限制). 语法:$("[attribut ...

  5. C# 获取 与 修改 web.config中的值(修改Xml文件)

    定义web.config 中 appSettings 节点 <appSettings> <add key="domainExist" value="fa ...

  6. el-input和和filter结合实现实时搜索

    <el-input placeholder="请选择日期" clearable prefix-icon="el-icon-search" v-model= ...

  7. JIRA7.13版本创建项目:工作流(二)

    工作流 在上一篇文章中,我们新建了一个问题类型,并且增加到问题类型方案里了,同时又关联到我们的这个项目中.那么这些问题我们需要如何设置流程走向来表示问题的处理过程呢?这就需要设定一个流程,并将这个流程 ...

  8. iOS检测QQ是否安装

    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"mqq://"]]) {     ...

  9. 添加一个静态JAVA库

    LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Build all java files in the java subdirectory L ...

  10. 泛型中的<Object>并不是像以前那样有继承关系的,也就是说List<Object>和List<String>是毫无关系的

    泛型中的<Object>并不是像以前那样有继承关系的,也就是说List<Object>和List<String>是毫无关系的