PTA 7-20 表达式转换
转自: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 表达式转换的更多相关文章
- 计算器类(C++&JAVA——表达式转换、运算、模板公式)
运行: (a+b)*c 后缀表达式:ab+c* 赋值: Enter the a : 10 Enter the b : 3 Enter the c : 5 结果为:65 代码是我从的逻辑判断系统改过来的 ...
- ZH奶酪:Python 中缀表达式转换后缀表达式
实现一个可以处理加减乘数运算的中缀表达式转换后缀表达式的程序: 一个输入中缀表达式inOrder 一个输出池pool 一个缓存栈stack 从前至后逐字读取inOrder 首先看一下不包含括号的: ( ...
- lambda表达式转换sql
using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; usin ...
- SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式
数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...
- 3-06. 表达式转换(25)(中缀表达式转后缀表达式ZJU_PAT)
题目链接:http://pat.zju.edu.cn/contests/ds/3-06 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式. 日常使用的算术表达式是採用中缀表示法,即二元运算符位于两 ...
- Linq to Entity经验:表达式转换
http://www.cnblogs.com/ASPNET2008/archive/2012/10/27/2742434.html 最近一年的项目,我主要负责一些小型项目(就是指企业内部的小项目),在 ...
- 第五周PTA笔记 后缀表达式+后缀表达式计算
后缀表达式 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右进行(不用考虑运算符的优先级). 如:中缀表达式 3(5–2 ...
- php中将url中的参数含有%20进行转换或解码
我的url: .......index.php?action=search&start=12&search=star wave&orderby=categories&s ...
- JDK8 Lamdba表达式转换成Map,value为null问题
// 将list转换成Map类型 Map<String, String> map = list.stream().collect(Collectors.toMap(Person::getI ...
随机推荐
- 【leetcode】1237. Find Positive Integer Solution for a Given Equation
题目如下: Given a function f(x, y) and a value z, return all positive integer pairs x and y where f(x,y ...
- 18-Node.js学习笔记-Express-请求处理-构建模块化路由
构建模块化路由 const express = require('express') //创建路由对象 const home = express.Router(); //将路由和请求路径进行匹配 ap ...
- 一组相关联的问题:“sudo: unable to resolve host ###: Connection timed out”、软件启动速度超慢、IPv6无法使用
造冰箱的大熊猫@cnblogs 2018/9/15 近日陆续发现计算机出现几个问题,最终发现这些问题实际上是由同一个原因导致的 问题1:无法使用IPv6 问题2:无论是启动Emacs GUI还是在命令 ...
- 51 Nod 1069 Nim游戏
分析: a1 xor a2 xor a3 ... xor an !=0 则为必胜态 a1 xor a2 xor a3 ... xor an ==0 则为必败态 也就是说只要计算异或值,如果非零则A赢, ...
- python学习之路(5)
条件判断 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if语句实现: age=20 if age>=18: ...
- sklearn.model_selection Part 1: Splitter Classes
1. GroupKFold(_BaseKFold) 主要参数: n_splits : int, default=3 在GroupKFold.split(X[, y, groups])中会调用下面的方法 ...
- RF变量
变量作用域 变量类型 变量作用域 case中的变量 case内部 userkeyword中的变量 userkeyword内部 文件型suite里的变量 文件suite内部,其下case均可使用 目录型 ...
- Gson解析list类型的json串
Gson gson = new Gson(); Type type = new TypeToken<List<Object>>() {}.getType(); List< ...
- track-by的使用
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- day8_文件操作及编码解码
一.文件操作基本流程 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所 ...