ZOJ 1423_(Your)((Term)((Project)))

大意:输入若干条式子,其中包含一些多余的括号(但全部都符合前配后)和空格,不改变运算符,输出没有多余括号和空格的式子。

 

分析:主要考虑五种情况:1、整个式子在括号内,要忽略括号;2、'+'后的括号要忽略;3、'-'后的括号要保留;4、(A)这样的括号要忽略;5、同时多个括号叠加要忽略,如((()))。考虑到情况比较多而复杂,我先做大概处理,然后再单独处理(A)这样的情况。注意用栈做好括号的匹配。

 

#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
int main()
{
	stack<char> sk;
	char s[256],result[256];
	int i,j,t;
	cin>>t;
	getchar();
	while(t--)
	{
		cin.getline(s,256);
		for(i=0,j=0;s[i]!='\0';i++)//初步处理,先忽略(A)这种类型的括号 
		{
			if(s[i]>='A'&&s[i]<='Z'||s[i]=='+'||s[i]=='-')
				result[j++]=s[i];
			else
			{
				switch(s[i])
				{
				case '(':
					if(j==0||result[j-1]!='-')//只要括号前是'+'或括整条式,忽略 
						sk.push('(');
					else
					{
						result[j++]='(';//括号前是'-' ,先保留,并做标记保留')' 
						sk.push('?');
					}
					break;
				case ')':
					if(sk.top()!='(')//有标记的保留 
						result[j++]=')';
					sk.pop();//吐掉前面压入的'('或标记 
					break;
				}
			}
		}
		result[j]='\0';
		for(i=0;i<j;i++)//单独处理(A)这种类型 
		{
			if(result[i]!='*')
			{
				if(result[i]=='('&&result[i+2]==')')//作标记 
				{
					result[i+2]='*';
					continue;
				}
				cout<<result[i];
			}
		}
		cout<<endl;
		while(!sk.empty())//清空栈 
			sk.pop();
	}
	return 0;
}


 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值