数据结构实验之栈四:括号匹配(栈)

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

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

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

输入

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

输出

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

示例输入

sin(20+10)
{[}]

示例输出

yes
no

提示

来源

ma6174

示例程序

典型的一道栈的应用。如果遇到(,【,{,先把他们压到栈里面,然后匹配消除。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    char str1[60],str2[60];
    int n,i;
    int cnt;
    int flag;
    while(gets(str1)!=NULL)
    {
        memset(str2,0,sizeof(str2));
        cnt=0;
        flag=0;
        n=strlen(str1);
        for(i=0;i<n;i++)
        {
            if(str1[i]=='('||str1[i]=='['||str1[i]=='{')//如果遇到左半边就把他们压倒栈里面。
                str2[cnt++]=str1[i];
            else if(str1[i]==')')
            {
                if(str2[cnt-1]==0)//如果栈为空,则表明该字符为第一个,无与他匹配的字符
                {
                    flag=1;
                    break;
                }
                else
                {
                    char str=str2[cnt-1];
                    if(str=='(')//如果栈不为空,且有与他匹配的字符,则将其取出栈。
                    {
                        str2[cnt-1]=0;
                        cnt--;
                    }
                    else
                    {
                        flag=1;
                        break;
                    }
                }
            }
            else if(str1[i]==']')
            {
                if(str2[cnt-1]==0)
                {
                    flag=1;
                    break;
                }
                else
                {
                    char str=str2[cnt-1];
                    if(str=='[')
                    {
                        str2[cnt-1]=0;
                        cnt--;
                    }
                    else
                    {
                        flag=1;
                        break;
                    }
                }
            }
            else if(str1[i]=='}')
            {
                if(str2[cnt-1]==0)
                {
                    flag=1;
                    break;
                }
                else
                {
                    char str=str2[cnt-1];
                    if(str=='{')
                    {
                        str2[cnt-1]=0;
                        cnt--;
                    }
                    else
                    {
                        flag=1;
                        break;
                    }
                }
            }
            if(flag==1)
                break;
        }
        if(flag==0&&str2[0]==0)
            printf("yes\n");
        else
            printf("no\n");
    }
    return 0;
}



时间: 2024-08-08 18:06:38

数据结构实验之栈四:括号匹配(栈)的相关文章

数据结构笔记之——括号匹配(栈的应用之一)(SDOJ 2134)

//  度过了上周的悲催状态,我决定好好学习了-- //书上括号匹配是栈的简单应用,正好在SDOJ上看到这道题,顺便做了下 题目地址:SDOJ 2134 数据结构实验之栈四:括号匹配 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入 输入数据有多组,处理到文件结束. 输出 如果匹配就输出

括号匹配(栈的应用)

#include <iostream> #include <stack> #include <string> using namespace std; int main() { int n;cin>>n; while(n--){ stack<char> s; string str;cin>>str; for(int i=0;i!=str.length();i++){ if(s.empty()) s.push(str[i]); else

SDUT 3361 数据结构实验之图论四:迷宫探索

数据结构实验之图论四:迷宫探索 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 有一个地下迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关:请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点? Input 连续T组数据输入,每组数据第一行给出三个正整数,分别表示地下迷宫的结点数N(1 < N <= 1000).边数M(M <= 30

SDUT 3343 数据结构实验之二叉树四:还原二叉树

数据结构实验之二叉树四:还原二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度. Input 输入数据有多组,每组数据第一行输入1个正整数N(1 <= N <= 50)为树中结点总数,随后2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区分大小写)的字符串. Output 输出一个整数,即该二叉树的

SDUT 3376 数据结构实验之查找四:二分查找

数据结构实验之查找四:二分查找 Time Limit: 20MS Memory Limit: 65536KB Submit Statistic Problem Description 在一个给定的无重复元素的递增序列里,查找与给定关键字相同的元素,若存在则输出找到的位置,不存在输出-1. Input 一组输入数据,输入数据第一行首先输入两个正整数n ( n < = 10^6 )和m ( m < = 10^4 ),n是数组中数据元素个数,随后连续输入n个正整数,输入的数据保证数列递增.随后m行输

数据结构实验之链表四:有序链表的归并

数据结构实验之链表四:有序链表的归并 Time Limit: 1000MS Memory limit: 65536K 题目描述 分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个大的有序单链表,并依次输出合并后的单链表数据. 输入 第一行输入M与N的值: 第二行依次输入M个有序的整数: 第三行依次输入N个有序的整数. 输出 输出合并后的单链表所包含的M+N个有序的整数. 示例输入 6 5 1 23 26 45 66 99 14 21 28 5

SDUT 3401 数据结构实验之排序四:寻找大富翁

数据结构实验之排序四:寻找大富翁 Time Limit: 200 ms Memory Limit: 512 KiB Problem Description 2015胡润全球财富榜调查显示,个人资产在1000万以上的高净值人群达到200万人,假设给出N个人的个人资产值,请你快速找出排前M位的大富翁. Input 首先输入两个正整数N( N ≤ 10^6)和M(M ≤ 10),其中N为总人数,M为需要找出的大富翁数目,接下来给出N个人的个人资产,以万元为单位,个人资产数字为正整数,数字间以空格分隔.

SDUT-3361_数据结构实验之图论四:迷宫探索

数据结构实验之图论四:迷宫探索 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 有一个地下迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关:请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点? Input 连续T组数据输入,每组数据第一行给出三个正整数,分别表示地下迷宫的结点数N(1 < N <= 1000).边数M(M <= 3000)和起始结点编号S,随后M行对应M条边,

imooc数据结构探险-栈篇 栈应用括号匹配二 由群友启发改良james_yuan老师算法

如图所示 引用群友内容 //老师代码有点麻烦了,不用声明两个mystack的,直接判断是否是左括号, //是的话就在mystack中push另一半括号:如果是右括号且又不是需要的括号, //就直接打印不匹配,如果是需要的右括号,就pop掉左括号.最后看mystack中栈顶是否为0,为0则打印括号匹配 /* 老师最后一点其实错了,default 其实没有必要写,只要把pNeedStack->pop(currentNeed)改为 if(!pNeedStack->pop(currentNeed))