数据结构 栈的实例应用,括号匹配

本文介绍了一种使用顺序栈解决括号匹配问题的方法。通过定义顺序栈结构体,实现初始化、入栈、出栈等操作,并利用这些操作检查字符串中的括号是否正确配对。文章还提供了一个测试函数来验证算法的有效性。

引用栈的顺序存储,实现括号匹配问题查找:

头文件:

#pragma once

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

#define MAX 1024

//顺序栈
struct SeqStack{
    void *data[MAX];
    int size;
};

#ifdef __cplusplus
extern "C"{
#endif

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

 

头文件实现:

#include"SeqStack.h"

//初始化栈
void *Init_SeqStack(){
    struct SeqStack *stack = malloc(sizeof(struct SeqStack));
    stack->size = 0; 
    for (int i = 0; i < MAX; i ++){
        stack->data[i] = 0;
    }

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

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

    s->data[s->size] = data;
    s->size++;
}
//出栈
void Pop_SeqStack(void *stack){

    if (0 == stack){
        return;
    }
    struct SeqStack *s = (struct SeqStack *)stack;
    s->size--;
}
//获得大小
int Size_SeqStack(void *stack){
    if (0 == stack){
        return -1;
    }
    struct SeqStack *s = (struct SeqStack *)stack;
    return s->size;
}
//获得栈顶元素
void *Top_SeqStack(void *stack){
    if (0 == stack){
        return NULL;
    }
    struct SeqStack *s = (struct SeqStack *)stack;
    return s->data[s->size - 1];
}
//销毁栈
void Destroy_SeqStack(void *stack){
    if (0 == stack){
        return;
    }
    free(stack);
}

 

测试函数:

#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,const char *errMsg, const char * p){
    printf("Error:%s\n",errMsg);
    printf("%s\n",str);
    int len = p - str;
    for (int i = 0; i < len; i ++){
        printf(" ");
    }
    printf("A\n");
}

void test(){

    const char *str = "5+)5*(6)+9/(3*1)-(1)+3()";
    //初始化栈
    void *stack = Init_SeqStack();

    char *p = (char *)str;
    while (*p != '\0'){
    
        //如果是左括号,直接入栈
        if (IsLeft(*p)){
            Push_SeqStack(stack, p);
        }

        //如果是右括号,会有两种情况出现: 1栈不为空,匹配成功,把栈中当前字符弹出
                                  //2栈不为空,右括号没有匹配左括号
        if (IsRight(*p)){
            
            if (Size_SeqStack(stack) > 0){
                Pop_SeqStack(stack);
            }
            else{
                printError(str, "没有匹配的左括号!", p);
            }
        }

        p++;
    }

    //判断栈是否为空
    while (Size_SeqStack(stack) > 0){
        
        //获得栈顶元素
        char *pChar = (char *)Top_SeqStack(stack);
        //弹出栈顶元素
        Pop_SeqStack(stack);
        //输出错误信息
        printError(str, "没有匹配的右括号!", pChar);
    }

}

int main(){

    test();

    system("pause");
    return EXIT_SUCCESS;
}

 

转载于:https://www.cnblogs.com/w-x-me/p/6782921.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值