数据结构实验之栈四:括号匹配
2016-07-28 09:21
357 查看
数据结构实验之栈四:括号匹配
Time Limit: 1000MS Memory limit: 65536K
题目描述
给你一串字符,不超过50个字符,可能包括括号、数字、字母、标点符号、空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配。输入
输入数据有多组,处理到文件结束。输出
如果匹配就输出“yes”,不匹配输出“no”示例输入
sin(20+10){[}]
示例输出
yesno
提示
来源
ma6174示例程序
这个题一开始提交了好几遍都wa,后来看到题中说字符串中包括空格,瞬间明悟了,泪奔.......,马上改输入
#include<stdio.h> #include<string.h> int main() { char str[100]; char arr[100]; int top; while(gets(str)!=NULL) { top = -1; for(int i = 0;str[i] != '\0';i++) { if(str[i] == '(' || str[i] == '{' || str[i] == '[') { ++top; arr[top] = str[i]; } else if(str[i] == ')') { if(arr[top] == '(') { top--; } else { ++top; arr[top] = str[i]; break; } } else if(str[i] == '}') { if(arr[top] == '{') { top--; } else { ++top; arr[top] = str[i]; break; } } else if(str[i] == ']') { if(arr[top] == '[') { top--; } else { ++top; arr[top] = str[i]; break; } } } if(str[0] != '\0' && top == -1) printf("yes\n"); else if(str[0] != '\0') printf("no\n"); } return 0; }
这个是用栈来做的
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define stackmax 10000
#define stacknum 10000
typedef struct
{
char *top;
char *base;
int stacksize;
}stack;
int initstack(stack &s)
{
s.base = (char *)malloc(stackmax*sizeof(char));
if(!s.base) exit(0);
s.top = s.base;
s.stacksize = stackmax;
return 1;
}
void push(stack &s,char e)
{
if(s.top - s.base > s.stacksize)
{
s.base = (char *)realloc(s.base,(s.stacksize + stacknum)*sizeof(char));
if(!s.base) exit(0);
s.top = s.base + s.stacksize;
s.stacksize += stacknum;
}
s.top++;
*s.top = e;
}
void pop(stack &s)
{
s.top--;
}
void choose(stack &s,char str[])
{
int i;
int f = 0;
char e;
for(i = 0;str[i] != '\0';i++)
{
if(str[i] == '(' || str[i] == '{' || str[i] == '[')
{
push(s,str[i]);
}
else if(str[i] == ')')
{
e = *s.top;
if(e == '(')
{
pop(s);
}
else
{
f = 1;
break;
}
}
else if(str[i] == '}')
{
e = *s.top;
if(e == '{')
{
pop(s);
}
else
{
f = 1;
break;
}
}
else if(str[i] == ']')
{
e = *s.top;
if(e == '[')
{
pop(s);
}
else
{
f = 1;
break;
}
}
}
if(!f && s.top == s.base)
printf("yes\n");
else
printf("no\n");
}
int main()
{
char str[1000];
stack s;
while(gets(str)!=NULL)
{
initstack(s);
choose(s,str);
}
return 0;
}
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- ASP编码必备的8条原则
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- XML指南——XML编码
- C#中字符串编码处理
- ExtJS中文乱码之GBK格式编码解决方案及代码
- 程序员趣味读物 谈谈Unicode编码
- 文本文件编码方式区别
- 数据结构之Treap详解
- C语言安全编码之数值中的sizeof操作符
- C#实现获取文本文件的编码的一个类(区分GB2312和UTF8)
- VC中BASE64编码和解码使用详解
- 计算机中的字符串编码、乱码、BOM等问题详解
- Base64编码解码原理及C#编程实例
- C#编码好习惯小结
- javascript编码的几个方法详细介绍