使用顺序栈来判断括号是否匹配

原理
主要是利用了栈的先进后出的原理,我们从左到右依次扫描需要判断的字符串,遇见“(”,“{”,“[”就入栈,遇见“)”,“]”,“]”就出栈。若三种左括号没有全部入栈便碰到了右括号那显然不匹配。碰到左括号进栈,碰到与其相匹配的右括号时出栈,当字符串扫描到‘\0’,并且此时栈为空则括号匹配,否则不匹配。

其中使用了stdio.h的库函数gets():输入一串字符串

代码如下:

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

using namespace std;

#define MaxSize 128//最大空间

typedef int ElemType;


typedef struct _SqStack {
    ElemType* base;//栈底指针
    ElemType* top;//栈顶指针
}SqStack;


//栈的初始化
bool InitStack(SqStack& S) {//构建一个空栈S,S是引用,就是别名
    S.base = new ElemType[MaxSize];//为顺序栈分配一个最大容量是MaxSize的空间
    if (!S.base)
        return false;
    S.top = S.base;//top初始化为base,空栈
    return true;
}

//入栈操作
bool putStack(SqStack& S, int e) {
    if ((S.top - S.base) == MaxSize)
        return false;
    *(S.top++) = e;
    //将元素压入栈顶,栈顶指针加一
    return true;
}


//出栈操作
bool PopStack(SqStack& S, int* e) {//删除栈顶元素,暂存在e里面
    if (S.base == S.top)//栈空
        return false;
    e = --S.top;
    return true;
}



//获取栈顶元素
/*int GetTop(SqStack& S, int* e) {//删除栈顶元素,暂存在e里面
    if (S.base == S.top)//栈空
        return -1;
    *e = *(--S.top);
    return 1;
}*/

int GetTop(SqStack& S, int& e) {//取出栈顶元素,栈顶指针不变
    if (S.base == S.top) {//栈空
        return 0;
    }
    else {
        e = *(S.top - 1);
        return 1;
    }
}



//判断栈是否为空5
bool IsEmpty(SqStack& S) {
    if (S.top == S.base) {
        return true;
    }
    else {
        return false;
    }
}

//销毁栈
void DestoryStack(SqStack& S) {//销毁栈
    if (S.base) {
        free(S.base);
        S.base = NULL;
        S.top = NULL;
    }
}



int same(ElemType e, ElemType ch) {
    if (e == '(' && ch == ')')
        return 1;
    else  if (e == '[' && ch == ']')
        return 1;
    else  if (e == '{' && ch == '}')
        return 1;
    else 
        return 0;
    
}


void main() {
    int i, o,e;
    SqStack S;
    InitStack(S);
    char* p;
    cout << "请输入算数表达式:";
    char str[120];//定义一个字符串数组
    gets_s(str);
    p = str;
    while (*p) {
        switch (*p) {
        case'(':
        case'{':
        case'[':
            putStack(S, *p++);
            break;
        case')':
        case'}':
        case']':
            if (IsEmpty(S)) {
                cout << "缺少左括号!" << endl;
                return;
            }
            else {
                GetTop(S,e);//栈顶元素
                if (same(e, *p))
                    PopStack(S, &e);
                else {
                    cout << "括号不匹配";
                    return ;
                }
            }
        default:
            p++;

        }
    }
    if (IsEmpty(S)) {
        cout << "括号匹配" << endl;
    }
    else {
        cout << "括号不匹配" << endl;
    }

}

在这里插入图片描述
数据结构要动手画啊啊啊啊啊啊啊啊啊

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值