模擬——刪除不必要的括號

注意:( (x+y) )z 這種情況,括號中的+共用!

出數據時注意複用的非常規情況。

(x+( (x+y) ( y ) ( t ) +m )  )z      

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
using namespace std;
char s[2010];
int p[2010],flag[2010],stack[2010];
//很顯然用棧結構來做 
int main()
{
	while(scanf("%s",s)!=EOF)
	{
		int top=-1;
		memset(p,0,sizeof(p));
		memset(flag,0,sizeof(flag));
		int len=strlen(s);
		for(int i=0;i<len;i++)
		{
			if(s[i]=='(')
				stack[++top]=i;
			else if(s[i]=='+')
				flag[stack[top]]=1;
			else if(s[i]==')')
			{
				bool f=i<len-1&&s[i+1]!='+'&&s[i+1]!=')';
				bool g=stack[top]>0&&s[stack[top]-1]!='+'&&s[stack[top]-1]!='(';
				//當括號內部有加法,並且外部乘以某數時,括號不能刪除 
				if(!(flag[stack[top]]&&(f||g)))
					p[stack[top]]=p[i]=1;
				//當兩個括號緊鄰(())時,括號內部的加號共用 
				if(i<len-1&&s[i+1]==')'&&stack[top]>0&&s[stack[top]-1]=='(')
					flag[stack[top-1]]=flag[stack[top]];
				top--;
			}
		}
		for(int i=0;i<len;i++)
			if(p[i]==0)
				printf("%c",s[i]);
		printf("\n");
	}
	return 0;
}


發佈了52 篇原創文章 · 獲贊 9 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章