http://poj.org/problem?id=1400

题意:给出一个表达式可能含有多余的括号,去掉多余的括号,输出它的最简形式。

思路:先将表达式转化成后缀式,因为后缀式不含括号,然后再转化成中缀式,并根据运算符的优先级添加括号。

 #include <stdio.h>
#include <string.h>
#include <string>
#include <stack>
#include <iostream>
using namespace std;
char ss[];
int f(char ch)
{
if(ch=='(')
return ;
else if(ch=='+'||ch=='-')
return ;
else if (ch=='*'||ch=='/')
return ;
}
void change1(string s)
{
int l = ;
stack<char>p;
while(!p.empty()) p.pop();
for (int i = ; i < s.size(); i++)
{
if(s[i]>='a'&&s[i]<='z')
ss[l++]=s[i];
else
{
if (s[i]=='(')
p.push(s[i]);
else if (s[i]==')')
{
while(!p.empty())
{
char ch = p.top();
p.pop();
if(ch=='(')
break;
ss[l++] = ch;
}
}
else
{
while(!p.empty()&&f(p.top())>=f(s[i]))
{
char ch = p.top();
p.pop();
ss[l++] = ch;
}
p.push(s[i]);
} }
}
}
while(!p.empty())
{
ss[l++] = p.top();
p.pop();
}
ss[l++]='\0';
}
void change2(char a[])
{
string s1, s2, s3, fl, fs;
string s[];
char f[];
int top = ;
s1 = a;
for(int i = ; i < (int)s1.length(); i++)
{
if(s1[i]>='a' && s1[i]<='z')
{
fl = s1[i];
top++;
s[top] = s1[i];
}
else if(s1[i]=='+')
{
s2 = s[top];
top--;
s3 = s[top];
top--;
top++;
s[top] = s3+'+'+s2;
f[top] = '+';
}
else if(s1[i]=='-')
{
s2 = s[top];
top--;
s3 = s[top];
top--;
if(f[top+]=='+' || f[top+]=='-')
{
if(s2.length()>) s2 = '('+s2+')';
}
top++;
s[top] = s3+'-'+s2;
f[top] = '-';
}
else if(s1[i]=='*')
{
s2 = s[top];
top--;
s3 = s[top];
top--;
if(f[top+]=='+' || f[top+]=='-')
{
if(s3.length()>) s3 = '('+s3+')';
}
if(f[top+]=='+' || f[top+]=='-')
{
if(s2.length()>) s2 = '('+s2+')';
}
top++;
s[top] = s3+'*'+s2;
f[top] = '*';
}
else if(s1[i]=='/')
{
s2 = s[top];
top--;
s3 = s[top];
top--;
if(f[top+]=='+' || f[top+]=='-')
{
if(s3.length()>) s3 = '('+s3+')';
}
if(f[top+]=='+' || f[top+]=='-' || f[top+]=='*' || f[top+]=='/')
{
if(s2.length()>) s2='('+s2+')';
}
top++;
s[top] = s3+'/'+s2;
f[top] = '/';
}
}
cout<<s[]<<endl;
}
int main()
{ //freopen("expr.in", "r", stdin);
//freopen("ss.out", "w", stdout);
int t;
string s;
cin>>t;
while(t--)
{
cin>>s;
change1(s);
change2(ss);
}
return ;
}

Complicated Expressions(表达式转换)的更多相关文章

  1. lambda表达式转换sql

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

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

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

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

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

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

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

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

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

  6. Angularjs –– Expressions(表达式)

    点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/ Angular的表达式 Angular的表达式和JavaScript代码很像,不过通常A ...

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

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

  8. PTA 7-20 表达式转换

    转自:https://www.cnblogs.com/yuxiaoba/p/8399934.html 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元 ...

  9. uva 11234 Expressions 表达式 建树+BFS层次遍历

    题目给出一个后缀表达式,让你求从下往上的层次遍历. 思路:结构体建树,然后用数组进行BFS进行层次遍历,最后把数组倒着输出就行了. uva过了,poj老是超时,郁闷. 代码: #include < ...

随机推荐

  1. java用递归输出目录结构

    package com.janson.day20180827; import java.io.File; public class TestTreeStructureDirectory { publi ...

  2. 1007 Maximum Subsequence Sum (PAT(Advance))

    1007 Maximum Subsequence Sum (25 分)   Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A ...

  3. node-sass 安装失败

    安装 npm install 时偶尔遇到报错:没有安装python或node-sass 安装失败的问题,百度之后发现是被墙了,但根据百度的方法换了淘宝镜像和用了vpn都安装失败, 原因可能是没有卸载之 ...

  4. 【Codeforces 924C】Riverside Curio

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 设第i天总共的线数为t[i] 水平线上线数为m[i]是固定的 水平线下的线数设为d[i] 则d[i]+m[i]+1=t[i] 也就是说问题可以 ...

  5. 转载 - Python里面关于 模块 和 包 和 __init__.py 的一些事

    出处:http://www.cnblogs.com/tqsummer/archive/2011/01/24/1943273.html python中的Module是比较重要的概念.常见的情况是,事先写 ...

  6. H5存储------localStorage和sessionStorage

    web现在随着计算机的高速发展,客户端干的事情越来越多了,随着事情的增多,很多东西存储就不止在服务器了,本地存储越来越强大了(大神原谅我废话了

  7. 统计单词个数(codevs 1040)

    题目描述 Description 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<= ...

  8. J2EE 课件3 JSP标记

    •JSP标记包括指令标记.动作标记和自定义标记.其中自定义标记主要讲述与Tag文件有关的Tag标记    1.指令标记page page 指令用来定义整个JSP页面的一些属性和这些属性的值,属性值用单 ...

  9. Linux下汇编语言学习笔记74 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  10. WPS for Linux字体配置(Ubuntu 16.04)

    错误提示: 解决方法: 从http://bbs.wps.cn/thread-22355435-1-1.html下载字体库,离线版本:(链接: https://pan.baidu.com/s/1i5dz ...