栈------括号匹配

文章详细描述了如何使用C语言创建一个字符栈数据结构,包括初始化、压栈、弹栈操作,并利用栈来检测给定字符串中括号的正确匹配。通过示例测试展示了bracketMatching函数的使用,用于判断表达式中的括号是否匹配。
摘要由CSDN通过智能技术生成

#include <stdbool.h>
#include <stdio.h>
#include <malloc.h>

#define STACK_MAX_SIZE 10

typedef struct CharStack{
    int top;
    char data[STACK_MAX_SIZE];
}*CharStackPtr;

//输出 
void outputStack(CharStackPtr paraStack){
    int i;
    for(i=0;i<=paraStack->top;i++){
        printf("%c",paraStack->data[i]);
    }
    printf("\r\n");
}


//初始化空
CharStackPtr charStackInit(){
    CharStackPtr resultPtr=(CharStackPtr)malloc(sizeof(struct CharStack)); 
    resultPtr->top =-1;
    return resultPtr;

//压栈
void push(CharStackPtr paraStackPtr,int paraValue){
    //检查空间
    if(paraStackPtr->top>=STACK_MAX_SIZE-1){
        printf("Cannot push element: stack full.\r\n");
        return;
    } 
    
    //更新顶
    paraStackPtr->top ++;
    
    //加元素
    paraStackPtr->data[paraStackPtr->top]=paraValue;
    

//弹栈
char pop(CharStackPtr paraStackPtr){
    //空间检查
    if(paraStackPtr->top <0){
        printf("Cannot pop element: stack empty.\r\n");
        return 0;
    } 
    
    //更新顶
    paraStackPtr ->top--;
    
    //弹出
    return paraStackPtr->data[paraStackPtr->top +1];    


//测试
void pushPopTest(){
    printf("---- pushPopTest begins. ----\r\n");
    char ch;
    
    //初始化
    CharStackPtr tempStack=charStackInit(); 
    printf("After initialization, the stack is: ");
    outputStack(tempStack);
    
    //弹栈
    for(ch='a';ch<'m';ch++){
        printf("Pushing c.\r\n", ch);
        push(tempStack,ch);
        outputStack(tempStack);
    } 
    
    //弹栈 
    int i;
    for (i = 0; i < 3; i ++) {
        ch = pop(tempStack);
        printf("Pop %c.\r\n", ch);
        outputStack(tempStack);
    }
     printf("---- pushPopTest ends. ----\r\n");    

bool bracketMatching(char* paraString, int paraLength){
    //初始化
    CharStackPtr tempStack =charStackInit();
    push(tempStack,'#');
    char tempChar,tempPopedChar;
    
    //遍历
    int i;
    for(i=0;i<paraLength;i++){
        tempChar = paraString[i];
        switch(tempChar){
            case '(':
            case '[':
            case '{':
                push(tempStack,tempChar);
                break;
            case')':
                tempPopedChar=pop(tempStack);
                if(tempPopedChar!='('){
                    return false;
                }
                break;
            case']':
                tempPopedChar = pop(tempStack);
                if (tempPopedChar != '[') {
                    return false;
                }
                break;
            case'}':
                tempPopedChar = pop(tempStack);
                if (tempPopedChar != '{') {
                    return false;
                }
                break;
            default:
                break;
        }
    } 
    tempPopedChar = pop(tempStack);
    if (tempPopedChar != '#') {
        return false;
    }
    return 1;
}


//测试
 void bracketMatchingTest() {
    char* tempExpression = "[2 + (1 - 3)] * 4";
    bool tempMatch = bracketMatching(tempExpression, 17);
    printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);


    tempExpression = "( )  )";
    tempMatch = bracketMatching(tempExpression, 6);
    printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);

    tempExpression = "()()(())";
    tempMatch = bracketMatching(tempExpression, 8);
    printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);

    tempExpression = "({}[])";
    tempMatch = bracketMatching(tempExpression, 6);
    printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);


    tempExpression = ")(";
    tempMatch = bracketMatching(tempExpression, 2);
    printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch);
}


void main() {
    
    bracketMatchingTest();
}

一匹配错误就结束;

在栈底放一个‘#’,若最后弹出‘#’,则成功匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值