数据结构括号匹配(附源代码已测试)

来源:互联网 发布:淘宝联盟的返利 编辑:程序博客网 时间:2024/05/29 07:43
#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define STACK_INIT_SIZE 100#define STACKINCREACE 10typedef struct{    char *base;    char *top;    int stacksize;}stack;int main(){    // 初始化栈    void InitStack(stack *s);    // Push入栈    void Push(stack *s, char e);    // Pop出栈,删除栈顶元素    void Pop(stack *s);    // 返回栈顶元素    char GetTop(stack *s, char e);    // 计算栈的长度,判断是否栈空    int Top_Base(stack *s);    // 定义    stack s;    int i;    int num;    char a[20];//最大的括号数    char temp,e;    int temper;    InitStack(&s);    // 1.输入括弧,并用空格隔开    printf("Please input the bracket's number u want:");    scanf("%d",&num);    getchar();    printf("Please input the bracket without space:\n");    for(i=0;i<num;i++)        scanf("%c",&a[i]);    // 2.依次判断左括号还是右括号,并作出不同操作    if((a[0] == ')') || (a[0] == ']') || (a[0] == '}'))        printf("Fail to match!");    for(i=0; i<num; i++)    {        // 2.1判断若是左括号则入栈        if((a[i]=='[') || (a[i]=='{') || (a[i]=='('))        {            Push(&s, a[i]);            continue;        }        // 否则是右括号则去栈顶元素进行判断是否匹配        else        {            // 取栈顶元素进行匹配比较            temp = GetTop(&s, e);            // 2.1.1如果栈顶元素与右括号匹配则continue比较下一个            switch(temp)            {                case '(': if(a[i] == ')') {Pop(&s); continue;}                case '[': if(a[i] == ']') {Pop(&s); continue;}                case '{': if(a[i] == '}') {Pop(&s); continue;}                default: printf("Fail to match!");            }        }    }    // 如果站内括号都匹配完毕,则栈为空,表明匹配成功。栈空即s->top - s->base ==0    temper = Top_Base(&s);    if(temper == 0)        printf("Success to match!");    else        printf("Fail to match!");    return 0;}void InitStack(stack *s){    // 动态分配内存    s->base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));    s->top = s->base;    s->stacksize += STACKINCREACE;}void Push(stack *s, char e){    //判断是否栈满,如果栈满则增加空间    if(s->top - s->base == s->stacksize)    {        s->base = (char *)realloc(s->base, STACKINCREACE * sizeof(char));        // 若内存分配失败,则退出        if(!s->base)            exit(0);        // 分配成功则改变栈的指标        s->top = s->base + s->stacksize;// 保证分配前top指针在栈顶,因为有可能出现栈满top++不在栈内的情况        s->stacksize += STACKINCREACE;    }    *(s->top) = e;    s->top++;}char GetTop(stack *s, char e){    // 如果栈空,则退出    if(s->base == s->top)        exit(0);    e = *(s->top - 1);    return e;}int Top_Base(stack *s){    s->stacksize = s->top - s->base;    return s->stacksize;}void Pop(stack *s){    s->top = s->top - 1;}
总结:
1、s->top与s->base的差显示的是两个指针指向块数的差
2、在连续两次scanf(),进行输入时中间需要回车一下,一定记得用getchar(),接一下回车键,
不然会出错,输入错位。
3、逻辑思维还需要进一步锻炼,程序编码前流程图还需要缜密逻辑强一些。

原创粉丝点击