C语言1557: 数据结构-栈-字符串匹配

题目描述

字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式,从内到外必须是<>,(),[],{},例如。输入: [()] 输出:YES,而输入([]), ([])都应该输出NO。

输入

文件的第一行为一个整数n,表示以下有多少个由括好组成的字符串。接下来的n行,每行都是一个由括号组成的长度不超过255的字符串。

输出

在输出文件中有N行,每行都是YES或NO。

样例输入

5
{}{}<><>()()[][]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{{}}{{}}<<>><<>>(())(())[[]][[]]
{<>}{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]
><}{{[]}<<<>><<>>>((<>))(())[[(<>)]][[]]

样例输出

YES
YES
YES
YES
NO
题目:要求用栈,但是和前2题括号匹配不同,要区别括号的顺序,我用的一个show()函数,当你要入栈的时候查看一下栈顶元素的括号和入栈的括号是否满足顺序,若不满足则把FLAG为ERROR直接break退出循环,p.s这里加了FLAG标志位因为不加话的退出循环就不太好判断。其他的和上提类似。此方法有点笨拙,就一直判断就行了

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#define maxsize 255
#define ERROR 0
#define OK 1
typedef struct stack
{
int top;
char arr[maxsize];
}STACK ;
void init(STACK * ps);
void string_match(STACK *ps);
bool push(STACK * ps,char val);
char show_topElemt(STACK *ps);
bool pop(STACK * ps,char *val);
int main()
{
STACK st ;
init(&st);
string_match(&st);

}
void init(STACK * ps)
{
ps->top=-1 ;

}
void string_match(STACK *ps)
{
int i,j,num;
int flag =ERROR ;
char val ;
char ch[maxsize];
scanf("%d",&num); //5行字符串
for(i=0;i<num;i++)
{
flag = OK ;
memset(ps,0,sizeof(STACK));
init(ps);
memset(ch,0,sizeof(ch));
scanf("%s",ch);
for(j=0;j<strlen(ch);j++)
{
if(ch[j]==‘<‘)
{
push(ps,ch[j]);

}
else if(ch[j]==‘(‘)
{
if(show_topElemt(ps)==‘<‘)
{
flag = ERROR ;
break;

}
else
{
push(ps,ch[j]);

}
}
else if(ch[j]==‘[‘)
{
if(show_topElemt(ps)==‘(‘||show_topElemt(ps)==‘<‘)
{
flag = ERROR ;
break;
}
else
{
push(ps,ch[j]);

}
}
else if(ch[j]==‘{‘)
{
if(show_topElemt(ps)==‘(‘ || show_topElemt(ps)==‘[‘|| show_topElemt(ps)==‘<‘)
{
flag = ERROR ;
break;
}
else
{
push(ps,ch[j]);

}
}
else if(ch[j]==‘>‘)
{
if(pop(ps,&val))
{

if(val!=‘<‘)
{
flag = ERROR ;
break;
}
}
else
{
flag = ERROR ;
break;
}
}
else if(ch[j]==‘)‘)
{
if(pop(ps,&val))
{

if(val!=‘(‘)
{
flag = ERROR ;
break;
}
}
else
{
flag = ERROR ;
break;
}
}
else if(ch[j]==‘]‘)
{
if(pop(ps,&val))
{

if(val!=‘[‘)
{
flag = ERROR ;
break;
}
}
else
{
flag = ERROR ;
break;
}
}
else if(ch[j]==‘}‘)
{
if(pop(ps,&val))
{

if(val!=‘{‘)
{
flag = ERROR ;

break;
}
}
else
{
flag = ERROR ;
break;
}
}
}
if(ps->top ==-1 && flag == OK) printf("YES\n");
else printf("NO\n");
}
}
bool push(STACK * ps,char val)
{
if(ps->top == maxsize-1)
{
return false;
}
else
{

ps->arr[++ps->top]=val;

return true ;
}
}
char show_topElemt(STACK *ps)//只展示栈顶的一个元素,但是不动里面的元素和指针
{
char ch ;

ch =ps->arr[ps->top];

return ch ;
/*
if(ps->top == -1)
{
printf("栈为空");
}
else
{

}*/
}
bool pop(STACK * ps,char *val)
{
if(ps->top == -1)
{
return false;
}
else
{
*val=ps->arr[ps->top--];
return true ;
}
}

原文地址:https://www.cnblogs.com/cocobear9/p/12588856.html

时间: 2024-10-13 08:48:26

C语言1557: 数据结构-栈-字符串匹配的相关文章

C语言实现 数据结构-栈-括号匹配

题目描述 假设一个表达式有英文字母(小写).运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符.请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”:否则返回“NO”.假设表达式长度小于255,左圆括号少于20个. 输入 一行字符串 输出 YES或者NO 样例输入 ((1+b)-(a+3))*[email protected] 样例输出 YES 样例输入 (25+x)*(a*(a+b+b)@ 样例输出 NO 算法实现:1.利用栈来实现只需要考虑输入的是

C语言字符串匹配、goto语句、关机命令使用

1.程序执行修改窗口字体颜色命令: 2.程序执行修改窗口标题命令: 3.程序执行关机倒计时命令: 4.根据提示输入团队名称JYHACK TEAM 根据提示输入团队网址:http://bbs.jyhack.com 5.如果输入正确,则取消关机命令,并打开某一网页.    如果输入错误,那就等着关机吧. ps:当然对于略懂cmd命令的来说很简单,打开cmd,输入shutdown -a命令即可轻易解除. 源码如下: #include<stdio.h> //printf和scanf函数调用 #incl

正则表达式的使用,字符串提取,字符串匹配(C#语言)

在程序中常常设计字符串的处理,比如①:判断用户的输入字符串是否符合要求,是否是非法字符串,②:取出一个很复杂字符串的某一程序中需要的部分等 这事用自己写算法判断通常是十分困难的,所以遇到字符串的处理时要很快想到用正则表达式. 一:正则表达式元字符 •要想学会正则表达式,理解元字符是一个必须攻克的难关.不用刻意记 •.:匹配任何单个字符.例如正则表达式“b.g”能匹配如下字符串:“big”.“bug”.“b g”,但是不匹配“buug”,“b..g”可以匹配“buug”. •[ ] :匹配括号中的

用栈判断字符串匹配问题

实例主要实现:输入一个括号字符串,依次检验,若为左括号则入栈,若为右括号则出栈一个字符判断是否与之相对应,在最后还需判断栈是否为空,如果不为空则不匹配. 首先回顾栈的基本知识: 1.定义栈的结构体并初始化一个新栈: struct stack { char strstack[stacksize]; int top; }; void InitStack(stack &s) { s.top=-1; } 2.出栈和入栈操作: char Push(stack &s,char a) { if(s.to

C语言之基本算法41—字符串匹配问题

//字符串匹配问题 /* =============================================================== 题目:输入两字符串S,T,输出在S中存在但在T中不存在的字符存储到新的字符串中, 并保持其在字符串S中的顺序,然后在屏幕上显示新的字符串的内容. =============================================================== */ #include<stdio.h> #include<st

数据结构之 字符串---字符串匹配(kmp算法)

串结构练习——字符串匹配 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定两个字符串string1和string2,判断string2是否为string1的子串. 输入 输入包含多组数据,每组测试数据包含两行,第一行代表string1,第二行代表string2,string1和string2中保证不出现空格. 输出 对于每组输入数据,若string2是string1的子串,则输出"YES",否则输出"NO". 示例输入

字符串匹配(KMP 算法 含代码)

主要是针对字符串的匹配算法进行解说 有关字符串的基本知识 传统的串匹配法 模式匹配的一种改进算法KMP算法 网上一比較易懂的解说 小样例 1计算next 2计算nextval 代码 有关字符串的基本知识 串(string或字符串)是由零个或多个字符组成的有限序列,一般记为 当中s是串的名,用单引號括起来的字符序列是串的值:ai(1<=i<=n)能够是字母.数值或其它字符.串中字符的数组 n称为串的长度.零个字符的串称为空串,它的长度为0 串中随意个连续的字符组成的子序列称为该串的子串. 包括子

南阳OJ-2 括号配对 (数据结构-栈的应用)

括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100),表示有N组测试数据.后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组.数据保证S中只含有"[","]","(",")"四种字符 输出 每组输入数据的输出占一行,

字符串匹配的KMP算法

html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, "Microsoft YaHei UI", SimSun, SimHei, arial, sans-serif; line-height: 1.6; color: ; background-color: ; margin: 0; padding: 16px 20px; } h1, h2, h