顺序栈的操作实现括号匹配问题

#include <stdio.h>
#include <stdlib.h>
//201603041067   孔德露
#define STACKINCREAMENT 10//用来栈的增长 
#define MAXSIZE 100
#define OVERFLOW -2
#define OK 1
#define ERROR 0
typedef int status;
typedef char SElemtype;
typedef struct
{
    SElemtype *base;
    SElemtype *top;
    status stacksize;
}sqstack;
 
//初始化栈
status Init(sqstack *s)
{
    s->base = (SElemtype *)malloc(MAXSIZE* sizeof(SElemtype));
    if(!s->base) 
            exit(OVERFLOW);
    s->top = s->base;
    s->stacksize = MAXSIZE ;
    return OK;
}
 
//获取栈顶元素
status Gettop(sqstack *s, SElemtype e)
{
    if(s->top == s->base) 
            return ERROR;
    e = *(s->top-1);
    return OK;
}
 
//压栈
status push(sqstack *s, SElemtype e)
{
    if(s->top - s->base >= s->stacksize)
    {
      s->base = (SElemtype *)realloc(s->base, (s->stacksize + STACKINCREAMENT) * sizeof(SElemtype));
      if(!s->base)
              exit(OVERFLOW);
      s->top = s->base + s->stacksize;
      s->stacksize += STACKINCREAMENT;
    }
    *s->top++ = e;
    return OK;
}
 
//出栈
status pop(sqstack *s, SElemtype *e)
{
        if(s->top == s->base) 
                return ERROR;
        *e=*--s->top;
        return OK;
}
 
//判断是否为空栈
status stackempty(sqstack *s)
{
        if(s->top==s->base)
            return OK;
        return ERROR;
}
 
//清空栈
status clearstack(sqstack *s)
{
        if(s->top == s->base) 
                return ERROR;
        s->top = s->base;
        return OK;
}
 
//括号匹配算法
status Parenthesis_match(sqstack *s,char *str)
{
        int i=0, flag=0;
        SElemtype e;
        while(str[i]!='\0')
        {
            switch(str[i])
            {
                case '(':
                        push(s,str[i]);
                        break;
                case '[':
                        push(s,str[i]);
                        break;
                case ')':
                        {
                          pop(s,&e);
                          if(e != '(') 
                                  flag=1;
                        }
                        break;
                case ']':
                        {
                          pop(s,&e);
                          if(e!='[')
                                  flag=1;
                        }
                        break;
                default:
                        break;
            }
            if(flag)
                    break;
            i++;
    }
 
   if(!flag && stackempty(s))
        printf("括号匹配成功!");
   else
        printf("括号匹配失败!");
   return OK;
}
 
int main()
{
    char str[100], enter;
    sqstack s;
    Init(&s);
    printf("请输入字符串:");
    scanf("%s",str);
    scanf("%c",&enter);
    Parenthesis_match(&s,str);
    return 0;
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用顺序实现括号匹配的步骤如下: ```C++ // 定义结构体 typedef struct { char data[MAXSIZE]; int top; } SqStack; // 初始化 void InitStack(SqStack &S) { S.top = -1; } // 判断是否为空 bool StackEmpty(SqStack S) { if (S.top == -1) { return true; } return false; } // 进 bool Push(SqStack &S, char x) { if (S.top == MAXSIZE - 1) { return false; } S.top++; S.data[S.top] = x; return true; } // 出 bool Pop(SqStack &S, char &x) { if (S.top == -1) { return false; } x = S.data[S.top]; S.top--; return true; } // 获取顶元素 bool GetTop(SqStack S, char &x) { if (S.top == -1) { return false; } x = S.data[S.top]; return true; } // 判断括号是否匹配 bool BracketMatch(char exp[]) { SqStack S; InitStack(S); int i = 0; char e; while (exp[i] != '\0') { switch (exp[i]) { case '(': case '[': case '{': Push(S, exp[i]); break; case ')': if (StackEmpty(S)) { return false; } Pop(S, e); if (e != '(') { return false; } break; case ']': if (StackEmpty(S)) { return false; } Pop(S, e); if (e != '[') { return false; } break; case '}': if (StackEmpty(S)) { return false; } Pop(S, e); if (e != '{') { return false; } break; default: break; } i++; } if (StackEmpty(S)) { return true; } return false; } ``` 以上代码实现顺序的初始化、进、出、获取顶元素等基本操作,以及括号匹配的判断。在判断括号匹配时,遇到左括号则入,遇到右括号则弹出顶元素检查是否匹配。如果匹配则继续扫描,否则返回false。最后判断是否为空,如果为空则说明括号匹配成功,返回true,否则返回false。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值