1.
您将获得一个由括号( )和[ ]组成的字符串。这种类型的字符串被认为是正确的:
- 如果是空字符串
- 如果A和B是正确的,AB是正确的,
- 如果A是正确的,(A) 和 [A] 是正确的。
编写一个程序,该程序采用此类型的字符串序列并检查其正确性。您的程序可以假定最大字符串长度为128。
输入
第一行包含测试用例n 的数量。接下来的n行中的每一行都包含括号( )和[ ]的字符串。
输出
对于每个测试用例,如果表达式正确,则在单独的行中打印"是",否则打印"否"。
示例 1
输入示例 #1 content_copy3 ([]) (([()]))) ([()[]()])()
输出示例 #1 content_copyYes No Yes
思路
定义一个字符串栈,当输入“(”,“[“,时,入栈,当输入”)”,“]”,判定栈顶的元素是否与之相对应,并出栈。
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
getchar();//吸收一个换行
for(int k=0; k<n; k++)//输入多组数据
{
int flag=1,s=0;
int top=0;
char Q[130];
char ch[130];
gets(ch);
for(int i=0; ch[i]!='\0'; i++)
{
if(ch[i]=='('||ch[i]=='[')//当为(或{时入栈
{
Q[++top]=ch[i];
}
else
{
if(top==0)//当栈为空栈时,结束判定
{
flag=0;
break;
}
else if(ch[i]==')'&&Q[top]!='(')//当ch[i]与栈顶元素不匹配时,标记flag为0
{
flag=0;
break;
}
else if(ch[i]==']'&&Q[top]!='[')
{
flag=0;
break;
}
else top--;//当ch[i]与栈顶元素匹配时,出栈
}
}
if(flag==1&&top==0)//当栈为空栈且标记为1时,输出yes
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
}
2.
冰冰子最近新学习了队列和栈两种重要的数据结构,他知道它们具有push 和pop操作。
而冰冰子现在想同时研究栈和队列,于是,他开始了一个实验。
现在,假设队列和栈都是空的。给定一系列push k和pop操作之后,冰冰子想知道队列和栈中分别存的数字。若队列或栈已经空了,仍然接收到pop操作,则输出error。
Input
第一行为m,表示有m组测试输入,m<100。
每组第一行为n,表示下列有n行push k或pop操作。(n<150)
接下来n行,每行是push k或者pop,其中k是一个整数。
(输入保证同时在队列或栈中的数不会超过100个)Output
对每组测试数据输出两行,第一行是队列情况,若在队列空时收到pop操作,则输出error。其余情况将队列按照对头至队尾顺序输出队列中所有元素,中间用空格隔开。第二行是栈的情况,若在栈空时收到pop操作,则输出error。其余情况下按照栈底至栈顶的顺序输出栈中所有元素。
Sample Input
2 4 push 1 push 3 pop push 5 1 popSample Output
3 5 1 5 error error
#include<stdio.h>
#include<string.h>
int front=0,back=0,top=0;
int flag1=0,flag2=0;
int Q[1000];
int M[1000];
void push(int x)//入栈,入队
{
M[top]=x;
top++;
Q[back]=x;
back++;
}
void pop()//出栈,出队
{
top--;
front++;
if(top<0){
flag1=1;
}
if(back<front){
flag2=1;
}
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
flag1=0,flag2=0;
top=0;
front=0,back=0;
int m;
scanf("%d",&m);
for(int i=0; i<m; i++)
{
char ch[30];
int x;
scanf("%s",ch);//调用函数
if(strcmp(ch,"push")==0)
{
scanf("%d",&x);
}
if(strcmp(ch,"push")==0)
{
push(x);
}
if(strcmp(ch,"pop")==0)
{
pop();
}
}
if(flag1==1){//当在空队执行pop操作时,输出error
printf("error\n");
}
else{
if(front==back)//为空队时输入一个换行
{
printf("\n");
}
else
{
for(int j=front; j<back; j++)//输出操作后队列中的元素
{
if(j!=back-1)
printf("%d ",Q[j]);
if(j==back-1)
{
printf("%d\n",Q[j]);
}
}
}}
if(flag2==1){//当在空栈执行pop操作时,输出error
printf("error\n");
}
else{
if(top==0)//为空栈时输入一个换行
{
printf("\n");
}
else
{
for(int j=0; j<top; j++)//输出操作后栈中的元素
{
if(j!=top-1)
{
printf("%d ",M[j]);
}
else
{
printf("%d\n",M[j]);
}
}
}}
}
}
注意error的输出!
发现自己写代码总是会有很多小问题,很容易不注意一些细节,到最后纠错就改半天,无语住,以后要看清题意!!!