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. set解两数之和--P2141 珠心算测验

    题目描述 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术.珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及. 某学校的珠心算老师采用一种快速考察珠心算加 ...

  2. linux strings-在对象文件或二进制文件中查找可打印的字符串

    推荐:更多Linux 文件查找和比较 命令关注:linux命令大全 strings命令在对象文件或二进制文件中查找可打印的字符串.字符串是4个或更多可打印字符的任意序列,以换行符或空字符结束. str ...

  3. idea 如何将本地代码上传到github

    1. 首先切换到项目根目录下 执行 git init 2. 点击项目右键->Git->Repository->Remotes->编辑URL 到github代码地址.

  4. noip模拟赛 立方数2

    题目描述LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数,例如1,8,27就是最小的3个立方数.LYK还定义了一个数叫“立方差数”,若一个数可以被写作是两个立 ...

  5. 轰炸II

    题目背景 本题为轰炸数据加强版 题目描述 一个城市遭到了M次轰炸,每次都炸了一个每条边都与边界平行的矩形 在轰炸后,有N个关键点,指挥官想知道,它们有没有受到过轰炸,如果有,被炸了几次,最后一次是第几 ...

  6. 【BZOJ4398】福慧双修(二进制,最短路)

    题意: 此题中S=1 思路:Orz ManGod秒切此题 我觉得出入边权互换不太直观,就改了一下写法 第一次默认与1有关的第一条出边只出不入,第二次默认只入不出 ..]of longint; head ...

  7. CF899F. Letters Removing

    给一个字符串支持以下操作:区间删除某个特定字符.最后输出字符串.n,m<=200000. 这题我居然不会可以回家了.. 首先,单点删除,选个平衡树比如set. 然后,他给的下标是会随删除操作变化 ...

  8. 测试出来了第一版代码--可以得到用户token啦

    一版一版往前走啦... 先安装vs2010的学习版, 然后用codeblock来搞. 有一个msvcr100.dll这个文件需要和代码同级目录. 这样的好处是合规,然后,codeblock也可以用vs ...

  9. jq页面提示或者页面牵引浏览--页面的指引向导插件

    1.看看插件效果吧 2. html 文件 :index.html <!DOCTYPE html> <html lang="en"> <head> ...

  10. Oracle中的 row_number() over (partition by order by ) 用法

    oracle 里面经常这样用 select col1,col2..., row_number() over (partition by colx order by coly) from table_n ...