栈 括号匹配问题(C语言)

该博客介绍了一个C语言实现的算法,用于检查算术表达式中的括号是否正确匹配。通过创建一个栈来存储遇到的左括号,并在遇到右括号时检查它们的配对情况。如果栈在遍历完表达式后为空,则输出YES,表示括号匹配;否则输出NO,表示存在未匹配的括号。

栈 括号匹配问题(C语言)

栈 括号匹配问题

问题描述:

假设一个算术表达式中可以包含三种括号:圆括号“(”和“)”,方括号“[”和“]”和花括号“{”和“ }”,且这
三种括号可按任意的次序嵌套使用(如:…[…{… …[…]…]…[…]…(…)…)。编写判别给定表达式
中所含括号是否正确配对出现的算法。输出结果YES 或者 NO。

解法:

在这里插入图片描述

   先定义一个char型的数组,空间大小根据实际情况定义
char arr[100];

输入字符串
开始循环,直到arr为空;

检测每一个字符,如果字符为’ ( ’ 、‘ { ’或者’ [ ’,将字符入栈;如果不是这三个字符,先获取栈顶元素,赋值给x(如下),如果栈顶元素为’ ( ’同时arr[i]为‘ ) ’或者栈顶元素为’ { ’同时arr[i]为‘ } ’或者栈顶元素为’ [ ’同时arr[i]为‘ ] ’,将栈顶元素出栈。

for(i = 0;arr[i]!='\0';i++){
   
   
        if(arr[i] == '('||arr[i] == '{'||arr[i] == '['){
   
   
            push(s,arr[i]);
           }
        top(s,&x);
        if((arr[i]==')'&&x == '(')||arr[i]=='}'&&x == '{'||arr[i]==']'&&x == '['){
   
   
            pop(s);
        }
    
### C语言中利用实现括号匹配算法 在C语言中,可以通过数据结构来验证字符串中的括号是否正确配对。具体来说,当遇到左括号(如`(`、`[` 或 `{`)时将其压入;而当遇到右括号(如`)`、`]` 或 `}`)时,则尝试从顶弹出一个元素并检查其是否与当前右括号相匹配[^1]。 以下是基于此逻辑的一个简单实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_SIZE 100 // 定义结构体 typedef struct { char items[MAX_SIZE]; int top; } Stack; // 初始化 void initialize(Stack *stack) { stack->top = -1; // 初始为空 } // 压操作 int push(Stack *stack, char item) { if (stack->top >= MAX_SIZE - 1) { // 满检测 printf("Stack Overflow\n"); return 0; } stack->items[++(stack->top)] = item; return 1; } // 弹操作 char pop(Stack *stack) { if (stack->top < 0) { // 空检测 printf("Stack Underflow\n"); exit(EXIT_FAILURE); } return stack->items[(stack->top)--]; } // 获取顶元素而不移除它 char peek(const Stack *stack) { if (stack->top < 0) { return '\0'; // 如果为空返回空字符 } return stack->items[stack->top]; } // 检查两个括号是否匹配 int isMatchingPair(char opening, char closing) { if (opening == '(' && closing == ')') return 1; if (opening == '{' && closing == '}') return 1; if (opening == '[' && closing == ']') return 1; return 0; } // 主函数用于判断括号序列的有效性 int areParenthesesBalanced(const char* str) { Stack stack; initialize(&stack); for (size_t i = 0; i < strlen(str); ++i) { if (str[i] == '(' || str[i] == '{' || str[i] == '[') { push(&stack, str[i]); // 遇到左括号则压 } else if (str[i] == ')' || str[i] == '}' || str[i] == ']') { if (peek(&stack) == '\0' || !isMatchingPair(peek(&stack), str[i])) { return 0; // 不匹配或者已空的情况 } pop(&stack); // 匹配成功则弹出顶 } } return (stack.top == -1); // 若最后为空说明全部匹配完成 } int main() { const char testString[] = "{()}[]"; if (areParenthesesBalanced(testString)) { printf("The parentheses are balanced.\n"); } else { printf("The parentheses are not balanced.\n"); } return 0; } ``` 上述代码定义了一个简单的数据结构以及相应的基本功能:初始化、压、弹和获取顶元素的操作。程序的核心部分在于遍历输入字符串的过程中如何处理每种类型的括号,并最终确认整个表达式的合法性[^2]。 #### 注意事项 - 输入长度应小于预设的最大容量(MAX_SIZE),否则可能导致溢出错误。 - 对于不合法的输入情况(比如连续多个右括号),该算法能够及时发现并终止进一步计算。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

17丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值