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. 判断机型是否为iphoneX

    判断机型是否为iphoneX isIPhoneX() {                 var u = navigator.userAgent;                 var isIOS ...

  2. 部署web服务器的配置——补充mysql和tomcat

    今天想到了关于mysql的一些配置,以后关于配置mysql和tomcat相关的内容也会补充在这里. tomcat: 1. 更改内存(要设置tomcat内存,解决内存溢出的问题):安装版tomcat,打 ...

  3. 微信小程序-template模板

    ============================= 构建template模板                    ============================= 1.分析得出共为 ...

  4. 洛谷P1028数的计算

    https://www.luogu.org/problemnew/show/P1028 只用递归会超时,需要用递归型动规,用一个数组保存已经算过的值,避免重复计算. 求数字为n的方案数的最优子结构为: ...

  5. noip模拟赛 花

    [问题描述]商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的买花的方案?答案可能很大,输出答案mod p的值. ...

  6. Windows中更新python模块的命令

    最近写爬虫,突然发现自己的动态的User-Agent用不了了,所以想可能是新版本出来了,旧的版本用不了了,坏掉了. 一时间想不起用什么命令了,网上查了一下,发现很简单,所以记录一下方便以后忘了的时候快 ...

  7. [K/3Cloud] 如何在k3Cloud主页实现自定义页面的开发

    过自定义页签动态添加一些内容,比如网页链接.图片等. 如果是动态的增加链接,可以参考一下代码,然后在ButtonClick事件里面对链接进行处理. public override void After ...

  8. BZOJ3238:[AHOI 2013]差异

    求一个字符串的∑ ∑ len[i] + len[j] - 2 * lcp(i, j),其中i,j表示从i,j开始的后缀. 方法一:SA+单调栈,自行yy. 方法二:SAM构造出来,然后每个状态对答案的 ...

  9. jsp内置对象(转)

    JSP中一共预先定义了9个这样的对象,分别为:request.response.session.application.out.pagecontext.config.page.exception 1. ...

  10. android中listview点击事件的监听实现

    listview_bookmark.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public vo ...