jtd浅谈线性结构1.0

题目来源:洛谷P1241 括号序列
题目描述:
定义如下规则序列(字符串):

1.空序列是规则序列;

2.如果S是规则序列,那么(S)和[S]也是规则序列;

3.如果A和B都是规则序列,那么AB也是规则序列。

例如,下面的字符串都是规则序列:

(),[],(()),([]),()[],()[()]

而以下几个则不是:

(,[,],)(,()),([()

现在,给你一些由‘(’,‘)’,‘[’,‘]’构成的序列,你要做的,是补全该括号序列,即扫描一遍原序列,对每一个右括号,找到在它左边最靠近它的左括号匹配,如果没有就放弃。在以这种方式把原序列匹配完成后,把剩下的未匹配的括号补全。

输入格式
输入文件仅一行,全部由‘(’,‘)’,‘[’,‘]’组成,没有其他字符,长度不超过100。

输出格式
输出文件也仅有一行,全部由‘(’,‘)’,‘[’,‘]’组成,没有其他字符,把你补全后的规则序列输出即可。

输入输出样例
输入 #1复制
([()
输出 #1复制
()
说明/提示
将前两个左括号补全即可。
分析:
这是一道纯语文线性结构题
先…理解题意
这个描述太迷惑了2333,他的意思就是对于每一个右括号,匹配上一个没被成功匹配的括号,若能牵手成功小队小,中对中,二者都匹配成功,若牵手失败,则右括号求爱失败,左括号依然守望爱情。
也就是说,这题里描述的爱情匹配方法,不是那种我住长江头,君住长江尾的爱情,而是那种金风玉露一相逢,便胜却人间无数。
所以…这就是道栈的基操。对于每个左括号,入队,默认未匹配成功。对于每个右括号,判断其与队首括号是否能匹配,若匹配,则左括号出队,标记匹配成功。若不匹配,则右括号标记未匹配成功
AC C++

#include 
#include 
#include 
#include //最好加上,洛谷数据第五个点有点玄学
using namespace std;
int main ()
{
  string a;
  int dl[1000],pd[1000];
  int len,l;
  cin>>a;
  len=a.length ();
  l=0;
  for (int i=0;i<len;i++)
  {
    if (a[i]=='(')
    {
      l++;
	  dl[l]=i;//入栈
	  pd[i]=1;//赋1代表未匹配成功
	}
	if (a[i]=='[')
	{
	  l++;
	  dl[l]=i;
	  pd[i]=1;
	}
	if (a[i]==')')
	{
	  pd[i]=1;
	  if (a[dl[l]]=='(')
	  {
	  	pd[dl[l]]=0;//栈顶与当前括号匹配成功
	    pd[i]=0;
		dl[l]=0;
	    l--;//出栈
	  }
	}
	if (a[i]==']')
	{
	  pd[i]=1;
	  if (a[dl[l]]=='[')
	  {
	    pd[i]=0;
		pd[dl[l]]=0;
	    dl[l]=0;
	    l--;
	  }
	}
  }
  for (int i=0;i<len;i++)
  {
    if (pd[i]==1)//未匹配成功得帮忙补全 婚介所23333333
    {
	  if (a[i]=='(')
	    cout<<a[i]<<')';
	  if (a[i]=='[')
	    cout<<a[i]<<']';
	  if (a[i]==')')
	    cout<<'('<<a[i];
	  if (a[i]==']')
	    cout<<'['<<a[i];
	}
	else
	  cout<<a[i];
  }
  return 0;
}

祝大家不得肺炎,早日上学
written by——jtd
jtd浅谈线性结构1.0_第1张图片

你可能感兴趣的:(线性结构)