C语言 用栈实现 括号匹配

符号匹配(50分)
题目内容:
判断输入的括号字符串是否匹配,
括号有()、[]、{}、<>四种,
匹配的定义如下:
(1) 空字符串为匹配。
(2) 若S为匹配字符串,则(S)、[S]、{S}、为匹配自串。
(3) 两个匹配字符串串接亦为匹配字符串。

输入格式:
输入第一行为一个数字T,代表测试数据的笔数。
接下来会有T笔测试数据,每一笔测试数据一行。
每一笔测试数据的字符串长度不超过2000字符。
T < 1000

输出格式:
输出一行数字,输出测资中有多少匹配字符串。

输入样例:
5
()
<><>[]

([{[]}])
<()){}

输出样例:
4

c
0

3个回答

麻烦楼主采纳一下,谢谢^^

0

 /*** Seqstack.h **/
 #pragma once

#define MAXSIZE 1024

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct SStack
{
    void* data[MAXSIZE]; //保存数据的数组
    int size;
};

typedef void* SeqStack;

#ifdef __cplusplus
extern "C"{
#endif

    //初始化
    SeqStack Init_SeqStack();
    //入栈
    void Push_SeqStack(SeqStack stack,void *data);
    //出栈
    void Pop_SeqStack(SeqStack stack);
    //获得栈顶元素
    void* Top_SeqStack(SeqStack stack);
    //获得栈中元素个数
    int Size_SeqStack(SeqStack stack);
    //销毁栈
    void Destroy_SeqStack(SeqStack stack);


#ifdef __cplusplus
}
#endif

/***Seqstack.cpp**/
#include"SeqStack.h"

//初始化
SeqStack Init_SeqStack()
{
    //一般情况下,只要开辟内存空间都要初始化
    struct SStack *stack = malloc(sizeof(struct SStack));
    for (int i = 0; i < MAXSIZE;++i)
    {
        stack->data[i] = NULL;
    }

    //memset(stack->data, 0, MAXSIZE * sizeof(void *));

    stack->size = 0;

    return stack;
}
//入栈
void Push_SeqStack(SeqStack stack, void *data)
{
    if (NULL == stack)
    {
        return;
    }

    if (NULL == data)
    {
        return;
    }

    struct SStack *s = (struct SStack *)stack;

    if (s->size == MAXSIZE)
    {
        return;
    }

    s->data[s->size] = data;
    s->size++;

}
//出栈
void Pop_SeqStack(SeqStack stack)
{
    if (NULL == stack)
    {
        return;
    }

    struct SStack *s = (struct SStack *)stack;

    if (s->size == 0)
    {
        return;
    }

    s->size--;

}
//获得栈顶元素
void* Top_SeqStack(SeqStack stack)
{
    if (NULL == stack)
    {
        return NULL;
    }

    struct SStack *s = (struct SStack *)stack;

    if (s->size == 0)
    {
        return NULL;
    }

    return s->data[s->size - 1];

}
//获得栈中元素个数
int Size_SeqStack(SeqStack stack)
{
    if (NULL == stack)
    {
        return -1;
    }

    struct SStack *s = (struct SStack *)stack;

    return s->size;
}
//销毁栈
void Destroy_SeqStack(SeqStack stack)
{
    if (NULL == stack)
    {
        return;
    }

    free(stack);
    stack = NULL;
}

/****main.c*****/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include"SeqStack.h"

int IsLeft(char ch)
{
    return ch == '(';
}

int IsRight(char ch)
{
    return ch == ')';
}

void printError(const char *str, char *pos)
{
    printf("%s\n",str);
    int dis = pos - str;
    for (int i = 0; i < dis; ++i)
    {
        printf(" ");
    }
    printf("A\n");

}

void test()
{
    const char *str = "5+5*(6)+9/3(*1)-(1)+3()";


    char *p = (char *)str;

    //创建栈
    SeqStack stack = Init_SeqStack();

    while (*p != '\0')
    {

        //如果是左括号,入栈
        if (IsLeft(*p))
        {
            Push_SeqStack(stack, p);
        }

        //如果是右括号
        if (IsRight(*p))
        {

            if (Size_SeqStack(stack) > 0)
            {
                Pop_SeqStack(stack);
            }
            else
            {
                //printf("没有匹配的左括号!\n");
                printError(str, p);
            }

        }

        ++p;
    }


    //如果栈不为空,栈中剩下的是左括号
    while (Size_SeqStack(stack) > 0)
    {
        //printf("左括号没有匹配的右括号!\n");
        printError(str,  (char *)Top_SeqStack(stack) );
        Pop_SeqStack(stack);
    }

    //销毁栈
    Destroy_SeqStack(stack);

}

int main(){

    test();

    system("pause");
    return EXIT_SUCCESS;
}
0

楼主你自己根据我写的函数类似写出另外几个括号就可以了


0
baidu_36822230
baidu_36822230 好的谢谢指教
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C语言数据结构之利用栈进行括号匹配的检验
括号匹配的检验:    eg: [([][][)]]    不匹配        [([][])] 匹配思路:   0x0.首先建立两个栈,并对其初始化      0x1.对表达式进行遍历,将相邻两个不能匹配的入栈到栈A,然后检测栈空间A是否为偶数,如果是表明有存在的可能,如果不是则提示不匹配。0x2.检测栈空间A是否为偶数,如果是表明有存在的可能,如果不是则提示不匹配,遍历栈A,将不匹配的入栈...
C语言实现顺序栈的括号匹配
//顺序栈的使用举例:括号的匹配 #include #include #define OK      1 #define ERROR   0 #define TRUE    1 #define FALSE   0 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define BUFFERSIZE 256
c语言栈实现括号匹配
在文字处理软件或编译程序设计时,常常需要检查一个字符串或一个表达式中的括号是否相匹配? 匹配思想:从左至右扫描一个字符串(或表达式),则每个右括号将与最近遇到的那个左括号相匹配。则可以在从左至右扫描过程中把所遇到的左括号存放到堆栈中。每当遇到一个右括号时,就将它与栈顶的左括号(如果存在)相匹配,同时从栈顶删除该左括号。 算法思想:设置一个栈,当读到左括号时,左括号进栈。当读到右括号时,则从栈中弹
栈的括号匹配 C语言
//括号匹配 #define ElementType char struct StackNode { ElementType data; int Length; struct StackNode* pNext; }; typedef struct StackNode *Stack; Stack CreateStack() { Stack MyStack = (Stack)malloc(s...
数据结构之---C语言实现括号匹配(栈实现)
数据结构之---C语言实现括号匹配(栈实现)
栈---实现顺序栈及简单的括号匹配问题
栈 通常情况下,栈(Stack)可定义为只允许在表的末端进行插入和删除的线性表。允许插入和删除的一端称作栈顶(top),不允许插入和删除的一端称作栈底(bottom)。当栈中没有任何元素时则成为空栈。 栈的分类 栈的抽象数据类型有两种典型的存储方式: 顺序栈:基于数组的存储表示 链式栈:基于链表的存储表达方式 代码实现 //顺序栈的实现 #include&amp;lt;stdl...
数据结构-C语言括号匹配问题(栈和计数方式两种思想)
题目描述现在,有一行括号序列,里面只包含”(“,”)”,”[“,”]”四种符号,请你检查这行括号是否配对。 如: []是匹配的 ([])[]是匹配的 ((]是不匹配的 ([)]是不匹配的 求解思想这里提供了两种求解方法:一种是使用栈进行求解;另一种是使用计数器进行求解。下面分别对两种方法进行描述以及给出相应代码。栈定义一个计数器用来判断正反括号的数量,遇见 { 则count+1
栈实现简单括号匹配
#后来的开括号先被闭括号匹配掉,因此栈中仅缓存开括号,后进先出(匹配) #如果栈空了还有闭括号那错误,如()),否则将“(”踢出栈 from pythonds import Stack def parChecker(symbolString): s = Stack() balanced = True #定义一个布尔变量 index = 0 while index...
[NYOJ] 02括号配对问题(c语言链栈实现)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=2 括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述现在,有一行括号序列,请你检查这行括号是否配对。 输入第一行输入一个数N(0 输出每组输入数据的输出占一行,如果该字符串中所含的括号是配对
C数据结构之栈的应用:括号匹配和简单计算器
用C语言编程实现括号匹配和表达式求值,以九度OJ中的括号匹配和简单计算器两个例子来熟悉数据结构中堆栈的应用。
数据结构--用链表栈实现括号的匹配问题
在结构化存储数据集是常常使用数组即顺序表,但当数据庞大时用数组往往比较繁琐,例如我需要在数组中间添加一个元素进去,则需要移动很多个元素,而且在定义数组大小时,小了会溢出,大了会浪费。 而链表正是代替数组解决了这些问题。 链表可以在O(1)的复杂度下处理删除,添加等问题,而且可以用指针来动态分配存储空间,不会出现空间浪费的情况 例子: 编写一个Stack的用例,从输入中读取一个文本流并使用栈...
c++使用堆栈实现括号匹配问题
c++使用堆栈实现括号匹配问题
C语言利用栈的操作实现判断字符串中的括号是否匹配(只考虑半角括号:( ) { } [ ])
C语言利用栈的操作实现判断字符串中的括号是否匹配(只考虑半角括号:( ) { } [ ]) 题目均在sdibt acm oj上AC,参考《深入浅出数据结构和算法》教材,逐个复制即可运行,欢迎评论指正!   Description  输入一串字符串,编写算法判断字符串中的括号是否匹配,如果匹配,输出1,否则输出0。 注: 只考虑半角括号:( ) { } [ ],不考虑全角括号:( ) 【 ...
c语言栈的应用之括号匹配问题
括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对。 输入 第一行输入一个数N(0 输出 每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No 样例输入 3 [(]) (]) ([[]()]) 样例输出 No No
栈的应用——括号匹配的检验(C语言)
这个应用来自于严蔚敏的《数据结构(C语言版)》,即这本书上的第49页。大致要实现的功能如下: 假设表达式中允许包括两种括号:圆括号和方括号,其嵌套的顺序随意,即(【】())或【(【】【】)】等为正确的格式,【(】)或(【())等均为不正确格式。 在设计程序的时候,借助于栈,将每个元素遍历一遍,根据一定的条件来确定是出栈还是入栈,如果最后栈为空,则括号是匹配的,否则不会匹配。实现的代码如下:
C语言 顺序栈使用之括号匹配
//顺序栈的使用举例:括号的匹配 //作者:nuaazdh //时间:2011年12月5日 #include #include #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define STACK_INIT_SIZE 100 #define STACKINCREMENT
C++使用栈解决括号匹配问题
#include&amp;lt;iostream&amp;gt; #include&amp;lt;stack&amp;gt; #include&amp;lt;string&amp;gt; using namespace std; bool Judge(string str) { //使用栈判断括号匹配 stack &amp;lt;char&amp;gt;s; for (int i = 0; i &amp;lt; str.length(); i++) { ...
C语言中利用栈检测括号是否匹配
检测括号是否匹配的算法中,栈的特性是最符合括号特点的。栈的先进后出将括号的匹配正好完美实现。 思想: 从字符串开头向后逐个检测,检测到除括号外的元素就跳过。检测到左括号时,就进行入栈操作,继续向后检测。检测到有括号时,就检查栈顶元素是否是匹配的左括号。若不匹配,则直接返回错误信号,使程序结束;若匹配,进行出栈操作,继续向后检测。结束时,要判断栈是否为空,若不为空,则括号不匹配;若为空,则括号匹
括号配对问题(用数组来模拟栈的思想)
给出一串字符串,里面只包含“[&quot;,&quot;(&quot;,&quot;)&quot;,&quot;]&quot;,判断字符串里面的括号是否正确配对, #include&amp;lt;iostream&amp;gt; #include&amp;lt;algorithm&amp;gt; using namespace std; char st1[1000]; int main() { int a,b,c,t,n,m; char ch,ch1,ch2; cin&amp;gt;&amp;gt;
用c语言实现的括号匹配的源代码
void BracketMatch(char *str) { SeqStack S; int i; char ch; InitStack(S); for(i=0;str[i]!='\0';i++) { switch(str[i]) { case '(': case '[': case '{': Push(S,str[i]); break; case ')':if(IsEmpty(S)) { printf("\n右括号)多余!"); return;} else { GetTop(S,&ch); if(ch=='(') Pop(S,&ch); else { printf("\n对应的左右()括号不同类!"); return;} } break; case ']': if(IsEmpty(S)) { printf("\n右括号]多余!"); return;} else { GetTop(S,&ch); if(ch=='[') Pop(S,&ch); else { printf("\n对应的左右[]括号不同类!"); return;} } break; case '}': if(IsEmpty(S)) { printf("\n右括号}多余!"); return;} else { GetTop(S,&ch); if(ch=='{') Pop(S,&ch); else { printf("\n对应的左右{}括号不同类!"); return;} } break; } } if(IsEmpty(S)) printf("\n括号匹配!"); else printf("\n左括号多余!"); }
链栈实现括号匹配
链栈实现括号匹配        数据结构中有一种结构叫做栈,它是一种先入后出的结构,通过这个程序的编写,基本上颠覆了我对于指针的认识,我才发现我对于c语言的指针并没有深入理解,我仅仅是对于一级指针有所了解。指针的值和指针所指向的对象我还有点搞不清楚。      这个程序是括号的检验,因为之前写过顺序栈,这次想用链栈实现,使用尾插法,并让指针域指向上一个节点姐可以形成栈,通过这个程序我认识到了在
括号匹配问题(不用栈,用数组)
不用模板栈的话,就是建立一个数组,输入若是左括号,则入栈,stack[++top]=a[i],top为栈顶元素的指针,若是右括号,则出栈,stack[top--]。 此处关键是自增符号的顺序,为什么入栈要先加,出栈后减,因为栈顶指针永远都是最后一个元素前一个位置,入栈的时候要先移动指针,到上一个,才可以进栈。 还有要判断什么时候栈空,遇到右括号,如果此时栈空,即top==0,则左边没有元素了,
判断表达式括号是否匹配,C语言堆栈实现
#include #include #include #define STACK_INIT_SIZE 100 #define STACKINCREMENT  10 typedef struct Sq{ char *base; char *top; int stacksize; }SqStack; void InitStack(SqStack *s) { s->base
括号匹配代码实现--通过栈实现
很久没有看数据结构和算法相关的内容了,今天偶然看到有人问这个问题,就使用C写了一段代码,实现括号匹配。该程序修改下,可以设计成通用的字符串匹配函数。具体看个人是怎么设计的。         偶尔确实需要练练手,不然一些方法真很容易忘记。编写的代码如下。 using namespace std; //假定bracketsStr只包含大 中 小括号 BOOL BracketsIsMatc
利用顺序栈实现多项式的括号匹配
1.括号匹配函数如下: 2.下面是主函数: 3.源文件与头文件的关系: 4.调用的pop(出栈)函数与push(进栈)函数: void SeqStack::Push(const int& x){     //进栈函数 if(isFull()==true) overflowProcess(); top++; elements[top]=x; } bool Seq
数据结构——栈实现括号匹配
数据结构——栈实现括号匹配 真正学习之后,才发现那些所谓的大婶不过是多用功了些。不知道以前为什么不亲自动手做做,原来这么简单。 #include #include #include #include /**栈的链式存储**/ typedef struct Data{ char c; }; typedef struct Stack{ Data data; Stack *to
栈的应用举例:括号匹配(C#)
假设表达式允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即[ ( [ ] ( ) ) ]等为正确的格式,[ ( ]或( ( [ ) )为错误的格式。检验括号是否匹配的方法可用“期待的急迫程度”这个概念描述。 ...
数据结构——顺序栈及其应用(括号匹配)
/************************ author's email:wardseptember@gmail.com date:2018.1.1 顺序栈及其应用(括号匹配) ************************/ #include using namespace std; #define maxSize 50 typedef struct { int data[maxS
数据结构:栈的应用-数制转换和括号匹配
演示了使用栈完成两种简单的应用:数制转换和括号匹配,前者将10进制数转换成指定的进制数,后者计算一个字符串中的匹配括号对数。
括号匹配问题(数据结构——栈)
题目描述: 思路: 代码实现 #ifndef STACK #define STACK typedef struct { char str[200]; int top; }*stack, Stack; #endif #define max 20 #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; #inc...
栈的应用之括号匹配检验
栈结构具有后进先出的固有特性,在程序设计中很有帮助。这里举一个例子,将栈应用与括号匹配的检验。         假设表达式中允许三种括号:小括号、中括号和大括号,嵌套的顺序任意。( [ ] ) { } 、[ { } ]等均为正确格式。检验括号是否匹配可用“期待的急迫程度”来描述。接收一个正括号后,计算机期待着一个与之匹配的反括号。如果此时接收到一个反括号,若与期待的匹配,则这种“期待”得到消解;
括号匹配 数据结构 C语言版本
用栈的方法实现括号匹配,C语言版本。。。。。。。。
数据结构 括号匹配问题 (栈 C语言)
现在,有一行括号序列,请你检查这行括号是否配对。 输入数据保证只含有"[","]","(",")"四种字符输出如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No 代码如下 #include #include #define SIZE 20 #define CREMENT 10 typedef struct{ char *ba
用链栈实现字符串表达式括号匹配算法
用栈、字符串、if语句实现括号的匹配算法
[C/C++]OJ练习题:括号匹配[栈训练]
老题了,基本上就是用来做"栈"的训练。入门题。 蛮写一下,每次有人问就要现场写一遍也是挺麻烦的。
<数据结构>栈的应用一:括号匹配检测
括号匹配检测问题的简单描述:假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即([]())或者[([][])]等为正确的格式,([)]或者([][]等均为不正确的格式。 我实现的程序中包含三种括号,其实包含多少种都是一样的,重在理解结题思路,利用栈来解决一些问题。 下面给出我自己实现的源代码(仅供参考): “init.h”: #ifndef _INIT_H #defin
PTA - 括号匹配(一)
括号匹配(一)——堆栈解法 题目:给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配。 输入格式: 输入在一行中给出一行字符串,不超过100个字符,可能包括括号、数字、字母、标点符号、空格。 输出格式: 如果括号配对,输出yes,否则输出no。 输入样例1: sin(10+20) 输出样例1: yes 输入样例...
栈的应用--括号匹配的检验(C++)
严蔚敏数据结构49页题目。括号匹配的检验。题目的意思是假定只有两种括号[]()要求我们检测一组由'('')'']''['组成的数据是否满足括号匹配  ---()()[][]  YES  ([])([]())  YES  ]]]((]))  NO解题思路:读取字符,如果是左括号则入栈,如果是有括号则取栈顶元素与其进行比较,如果匹配则把栈顶元素弹出,否则直接跳出,输出不匹配。代码如下#include#
C++ 用栈实现字符串中括号匹配问题()
使用C++中的stack容器可以很容易的实现字符串中括号的匹配判断问题: #include #include #include using namespace std; int main() {     string str;     stack small;          cout     getline(cin,str);     for(int i=0;i
用栈解决----括号匹配问题(MatchBrackets)
问题:给出一个字符数组,判断里边的括号是否匹配。 分析:首先我们要确定用什么方法来解决这个问题,然后再进一步分析过程。 我们可以用栈来解决这个问题,如果是左括号我们就让它入栈,如果是右括号,我们先要判断它和栈顶元素(左括号)是否匹配,如果匹配,我们就让左括号出栈,依次进行,直到栈空时结束,当然如果在前边如果出现匹配不正确,我们直接返回,不用再向后进行了。 栈的特点:后进先出 好了,这个...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 用java实现班级通讯录 值班表用java实现