数据结构实验之栈与队列四:括号匹配

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

给你一串字符,不超过50个字符,可能包括括号、数字、字母、标点符号、空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配。

Input

输入数据有多组,处理到文件结束。

Output

如果匹配就输出“yes”,不匹配输出“no”

Sample Input

sin(20+10)
{[}]

Sample Output

yes

no

Hint

Source

ma6174

括号匹配,栈的经典题目,将左括号入站,然后遇到右括号就询问栈顶是不是与之相匹配的左括号,如果是,出栈,不是,匹配失败。

注意这个题目是多组输入,而且包含空格,所以需要用 gets读入。

#include <stdio.h>
#include <stdlib.h>
#include <string.h> typedef struct node
{
char data;
struct node *next;
}Node; typedef struct stack
{
Node *base,*top;
}Stack; Node *newnode()//建立节点
{
Node *t;
t = (Node *)malloc(sizeof(Node));
t->next = NULL;
return t;
}; Stack *Newstack()//建立新栈
{
Stack *t;
t = (Stack *)malloc(sizeof(Stack));
t->top = newnode();
t->base = t->top;
return t;
} void push(Stack *t,char x)//入站
{
Node *p = newnode();
p->data = x;
p->next = t->top->next;
t->top->next = p;
t->base = p;
} char top(Stack *t)//询问栈顶元素
{
return t->top->next->data;
} void pop(Stack *t)//出栈
{
Node *p;
p = t->top->next;
t->top->next = t->top->next->next;
free(p);
} int empty(Stack *t)//询问栈是否为空
{
if(t->top->next==NULL)
return 1;
return 0;
} void del(Stack *t)//清空栈
{
while(!empty(t))
pop(t);
} int main()
{
char s[55];
Stack *t;
int n,i;
t = Newstack();
while(gets(s)!=NULL)
{
n = strlen(s);
for(i=0;i<n;i++)
{
if(s[i]=='('||s[i]=='{'||s[i]=='[')
push(t,s[i]);
else if(s[i]==')'||s[i]=='}'||s[i]==']')
{
if(empty(t))
break;
else
{
if(s[i]==')'&&top(t)!='(')
break;
else if(s[i]=='}'&&top(t)!='{')
break;
else if(s[i]==']'&&top(t)!='[')
break;
else
pop(t);
}
}
}
if(i!=n)
printf("no\n");
else
{
if(!empty(t))//注意最后要判定是否所有的左括号都已经匹配
printf("no\n");
else
printf("yes\n");
}
del(t);
}
return 0;
}

线性表

#include <stdio.h>
#include <stdlib.h>
#include <string.h> typedef struct Stack
{
char *top,*base;
}Stack; Stack newStack()
{
Stack t;
t.top = (char *)malloc(100050*sizeof(char));
t.base = t.top;
return t;
} void push(Stack *t,char x)
{
*(t->top++) = x;
} char top(Stack t)
{
return *(t.top-1);
} void pop(Stack *t)
{
t->top--;
} int Empty(Stack t)
{
if(t.top==t.base)
return 1;
return 0;
} void del(Stack *t)
{
while(!Empty(*t))
pop(t);
} int main()
{
char s[55];
Stack t;
int n,i;
t = newStack();
while(gets(s)!=NULL)
{
n = strlen(s);
del(&t);
for(i=0;i<n;i++)
{
if(s[i]=='('||s[i]=='['||s[i]=='{')
push(&t,s[i]);
else if(s[i]==')')
{
if(Empty(t)||top(t)!='(')
break;
else
pop(&t);
}
else if(s[i]==']')
{
if(Empty(t)||top(t)!='[')
break;
else
pop(&t);
}
else if(s[i]=='}')
{
if(Empty(t)||top(t)!='{')
break;
else
pop(&t);
}
}
if(i!=n||!Empty(t))
printf("no\n");
else
printf("yes\n");
}
return 0;
}

SDUT-2134_数据结构实验之栈与队列四:括号匹配的更多相关文章

  1. 数据结构实验之栈与队列四:括号匹配(SDUT 2134)

    #include <bits/stdc++.h> using namespace std; typedef long long ll; char s[100]; char a[100]; ...

  2. SDUT-2088_数据结构实验之栈与队列十一:refresh的停车场

    数据结构实验之栈与队列十一:refresh的停车场 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description refresh最近发 ...

  3. SDUT-2449_数据结构实验之栈与队列十:走迷宫

    数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起 ...

  4. SDUT-1479_数据结构实验之栈与队列九:行编辑器

    数据结构实验之栈与队列九:行编辑器 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个简单的行编辑程序的功能是:接受用 ...

  5. SDUT-3335_数据结构实验之栈与队列八:栈的基本操作

    数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 堆栈是一种基本的数据结构.堆栈具 ...

  6. SDUT-3334_数据结构实验之栈与队列七:出栈序列判定

    数据结构实验之栈与队列七:出栈序列判定 Time Limit: 30 ms Memory Limit: 1000 KiB Problem Description 给一个初始的入栈序列,其次序即为元素的 ...

  7. SDUT-3332&3333_数据结构实验之栈与队列五:下一较大值

    数据结构实验之栈与队列六:下一较大值 Time Limit: 150 ms Memory Limit: 8000 KiB Problem Description 对于包含n(1<=n<=1 ...

  8. SDUT-2133_数据结构实验之栈与队列三:后缀式求值

    数据结构实验之栈与队列三:后缀式求值 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运算符的后缀表示式 ...

  9. SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式

    数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...

随机推荐

  1. tcpdump的表达式介绍

    表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表 达式的条件,则这个报文将会被捕获.如果没有给出任何条件,则网络上所有的信息包 将会被截获. 在表达式中一般如下几种类 ...

  2. Leetcode56. Merge Intervals合并区间

    给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间 [1,3] ...

  3. javascript之键盘事件的方法

    键盘事件包含onkeydown.onkeypress和onkeyup这三个事件 事件初始化 function keyDown(){} document.onkeydown = keyDown; //论 ...

  4. Quick BI取数模型深度剖析

    开发图表最关键的点在于选择准确的图表类型展示准确的数据,而准确的数据往往依赖于一个强大的取数模型,因此设计一个好的取数模型不仅可以解决数据安全的问题,更可以帮助每个访问者高效触达自己想要的数据,开发者 ...

  5. 卡特兰数(catalan)总结

    卡特兰数的公式 递推公式1:$f(n)=\sum \limits_{i=0}^{n-1}f(i)*f(n-i-1)$ 递推公式2:$f(n)=\frac{f(n-1)*(4*n-2)}{n+1}$ 组 ...

  6. agc015F Kenus the Ancient Greek

    题意: 有$Q$次询问,每次给定$X_i$和$Y_i$,求对于$1\leq x \leq X_i , 1 \leq y \leq Y_i$,$(x,y)$进行辗转相除法的步数的最大值以及取到最大值的方 ...

  7. vue学习之组件(component)(二)

    自定义事件 父组件使用 prop 传递数据给子组件.但子组件怎么跟父组件通信呢?这个时候 Vue 的自定义事件系统就派得上用场了. 1. 使用 v-on 绑定自定义事件 每个vue实例都实现了事件接口 ...

  8. Latex 出现编辑公式,出现错误 !pdfTex error: Font rntxmi7 at 438 not found

    http://docs.miktex.org/manual/advanced.html http://www.cl-projects.de/projects/misc/miktex-fonts.pht ...

  9. arcgis访问百度地图

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. DX9纹理半像素偏移-Directly Mapping Texels to Pixels

    原文:DX9纹理半像素偏移-Directly Mapping Texels to Pixels 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u01 ...