数据结构上机3栈-括号匹配

#include <stdio.h>
#include <malloc.h>
#define OK              1
#define OVERFLOW       -1
#define ERROR           0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT  10
typedef char SElemType;
typedef int Status;

typedef struct{
    SElemType  * base;
    SElemType  * top;
    int          stacksize;
}SqStack;
///////////////////////初始化栈
Status InitStack_Sq(SqStack * S){
    S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if(!S)
        exit(OVERFLOW);
    S->top = S->base;
    S->stacksize = STACK_INIT_SIZE;
    return OK;
}
///////////////////////栈是否为空
Status EmptyStack(SqStack * S){
    if(S->top == S->base)
        return OK;
}
///////////////////////栈置空
Status ClearStack(SqStack * S){
    S->top = S->base;
    return OK;
}
///////////////////////压栈
Status Push(SqStack * S, SElemType e){
    if(S->top - S->base >= S->stacksize){
        S->base = (SElemType *)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType));
        if(!S->base)
            exit(OVERFLOW);
        S->top = S->top + S->stacksize;
        S->stacksize += STACKINCREMENT;
    }
    *S->top++ = e;
    return OK;
}
///////////////////////出栈
Status Pop(SqStack *S, SElemType * e){
    if(S->top == S->base)
        return ERROR;
    *e = * --S->top;
    return OK;
}

/************************************************************
 *          匹配括号()[]                                     *
 * 1. 初始化栈->栈是否为空(不是空栈则置空)                      *
 * 2. 遍历字符串                                             *
 *     a.([压栈 b.)]匹配栈顶出栈 c.不匹配为多余 d.其他字符跳过   *
 * 3.匹配结束  输出栈中内容                                   *
 *                                                         *
 ************************************************************/
void  brackets(char * ch){
    SqStack S;
    SElemType e, *p;
    int i = 0, j=1;

    if(!InitStack_Sq(&S))
        puts("初始化失败\n");
    if(EmptyStack(&S))
        printf("\n匹配前:\n    栈为空\n");
    else
        ClearStack(&S);

    printf("\n开始匹配:\n");
    while(ch[i]){
        if(ch[i]== ‘[‘ || ch[i] == ‘(‘){
            Push(&S, ch[i++]);
            continue;
        }
        p = S.top-1;
        if(EmptyStack(&S)!=OK)
            if(*p == ch[i]-2 || *p == ch[i]-1){
                 Pop(&S, &e);
                 printf("%3d 第%3d个字符 %c 与栈顶 %c 匹配\n", j++, ++i, ch[i], e);
                continue;
            }
        if(ch[i] == ‘]‘ || ch[i] == ‘)‘){
            printf("%3d 第%3d个字符 %c 无匹配值\n", j++, ++i, ch[i]);
            continue;
        }
        i++;
    }

    p = S.top;
    if(EmptyStack(&S)!=OK){
        printf("\n匹配后:\n    栈中还剩下:\n");
        while (p--!=S.base)
            printf("%c ", *p);
    }
    else
        printf("\n匹配后:\n    栈为空,匹配成功");
}

int main(void){
    char ch[50];

    puts("请输入字符串: ");
    gets(ch);
    brackets(ch);
    printf("\n");
    return 0;
}
时间: 2024-08-06 16:06:46

数据结构上机3栈-括号匹配的相关文章

栈&amp;&amp;括号匹配

利用栈的结构性质实现括号匹配 (今天被自己玩死了,'='&&'=='小问题坑死人不偿命) Matbr.h #ifndef _MATCH_H_ #define _MATCH_H_ #include<iostream> #include<string.h> #include<assert.h> using namespace std; typedef char ElemType; #define STACK_MAX_SIZE 100 typedef stru

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

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

栈——括号匹配

Scaena Felix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 492    Accepted Submission(s): 214 Problem Description Given a parentheses sequence consist of '(' and ')', a modify can filp a paren

括号匹配-记错心得

数据结构课作业8--括号匹配时间限制: 1 Sec 内存限制: 128 MB提交: 278 解决: 113[提交][状态][讨论版]题目描述检查字符串中方括号.圆括号和花括号是否配对输入每个字符串一行,以0表示输入结束输出true 或者 false 每个一行样例输入(12,11,44,[6,[9]),(#)([#],([2],3,1}([#],([2],3,1),7)0样例输出falsefalsetrue 这是一道数据结构课后作业,看着蛮简单的,思路也挺清晰,首先明确错误例子有这些: 1.][

C数据结构-栈和队列,括号匹配举例

1.栈和队列是两种特殊的线性表 运算操作被限定只能在表的一端或两端插入,删除元素,故也称它们为限定的线性表结构 2.栈的基本运算 1).Stackinit(&s) 构造一个空栈 2).Stackempty(s) 判断s是否为空栈,当s为空栈时,函数返回值1 否则 0 3).Push(&s,x)  在栈s 的顶部插入元素x,简称将x入 栈 4).Pop(&s,&x) 在栈s 中删除顶元并将其值保存在x单元中返回,简称将x出栈 5)Gettop(s,&x)  读s栈中的

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

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

【数据结构】用栈检测括号是否匹配

//[数据结构]用栈检测括号是否匹配 //头文件 栈 #ifndef _STACK_ #define _STACK_ #include <iostream> #include <string.h> using namespace std; template <class Type> class Stack { public: Stack(size_t sz = INIT_SIZE) { capacity = sz > INIT_SIZE ? sz : INIT_S

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

数据结构实验之栈四:括号匹配 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入 输入数据有多组,处理到文件结束. 输出 如果匹配就输出"yes",不匹配输出"no" 示例输入 sin(20+10) {[}] 示例输出 yes no 提示 来源 ma6174

数据结构复习_栈和队列,应用_括号匹配&amp;文件目录递归拷贝,

1.主题 2.学习视频和资料 视频    http://study.163.com/course/courseLearn.htm?courseId=555010#/learn/video?lessonId=701019&courseId=555010 http://study.163.com/course/courseLearn.htm?courseId=555010#/learn/video?lessonId=702024&courseId=555010 3.实现 数组或列表实现 4.应