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

Posted 天码丶行满

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构 栈的实例应用,括号匹配相关的知识,希望对你有一定的参考价值。

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

头文件:

#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;
}

 

以上是关于数据结构 栈的实例应用,括号匹配的主要内容,如果未能解决你的问题,请参考以下文章

栈的典型实例问题——括号匹配

数据结构栈的应用——括号匹配问题

栈的应用(括号匹配算法实战)

数据结构_栈的应用

王道数据结构与算法栈的应用

数据结构(C语言) 栈的应用之括号匹配