BM44 有效括号序列

文章描述了一个C#编程问题,介绍了一个名为`isValid`的方法,用于检查给定字符串中括号是否正确配对。方法通过使用栈数据结构来实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;
using System.Collections.Generic;


class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return bool布尔型
     */
    public bool isValid (string s) {
        // write code here
        Stack<char> stack = new Stack<char>();
        for(int i = 0; i < s.Length; i++)
        {
            if(s[i]=='(' || s[i] == '{' || s[i] == '[')
                stack.Push(s[i]);
            else
            {
                if(stack.Count == 0)    return false;
                if(s[i] == '}' && stack.Peek() != '{')
                {
                    return false;
                }else if(s[i] == ']' && stack.Peek() != '[')
                {
                    return false;
                }else if(s[i] == ')' && stack.Peek() != '(')
                {
                    return false;
                }
                stack.Pop();
            }       
        }
        return stack.Count == 0 ? true : false;
    }
}

遍历整个字符串

遇到括号左半部分就进栈

遇到右半部分判断与现在的栈顶是否匹配,不匹配/栈空,为false,反之,相匹配的栈顶就出栈;

最后判断是否还剩下左边部分,即栈是否为空,为空,true,反之,false。

### 关于头歌平台的C语言数据结构大作业 #### 使用 `fread` 函数实现文件快速读取 在处理大型数据集时,使用 `fread` 函数能够显著提高程序性能。通过指定缓冲区大小和数据类型,可以直接从文件中批量读取数据到内存中[^1]。 ```c #include <stdio.h> int main() { FILE *file = fopen("data.bin", "rb"); if (!file) { printf("无法打开文件\n"); return 1; } int buffer[100]; size_t read_count = fread(buffer, sizeof(int), 100, file); fclose(file); printf("成功读取 %zu 个整数\n", read_count); return 0; } ``` 上述代码展示了如何利用 `fread` 函数高效地从二进制文件中读取大量整型数据。 --- #### 解析 BMP 文件格式 对于涉及图像处理的大作业,了解 BMP 文件格式至关重要。BMP 图像由三个主要部分构成:位图文件头、位图信息头以及实际像素数据[^2]。以下是解析 BMP 文件头部的一个简单示例: ```c typedef struct { unsigned short type; // BM标志 unsigned int fileSize; // 文件总字节数 unsigned int reserved; // 预留字段 unsigned int dataOffset; // 像素数组起始位置偏移量 } BitmapFileHeader; BitmapFileHeader read_bmp_header(FILE* file) { BitmapFileHeader header; fread(&header.type, sizeof(unsigned short), 1, file); fread(&header.fileSize, sizeof(unsigned int), 1, file); fseek(file, 8, SEEK_SET); // 跳过预留字段 fread(&header.dataOffset, sizeof(unsigned int), 1, file); return header; } int main() { FILE* bmp_file = fopen("example.bmp", "rb"); if (!bmp_file) { printf("无法打开BMP文件\n"); return 1; } BitmapFileHeader header = read_bmp_header(bmp_file); printf("BMP文件大小:%u 字节\n", header.fileSize); fclose(bmp_file); return 0; } ``` 此代码片段演示了如何定义并读取 BMP 文件头的数据结构。 --- #### 判断括号匹配的有效性 如果大作业涉及到字符串处理,比如验证括号序列是否合法,则可以借助栈这一经典数据结构来解决[^3]。下面是一个完整的解决方案: ```c #include <stdbool.h> #include <string.h> bool isValid(char* s) { char stack[10000]; // 定义一个固定大小的栈 int top = -1; for (size_t i = 0; s[i] != '\0'; ++i) { if (s[i] == '(' || s[i] == '{' || s[i] == '[') { stack[++top] = s[i]; // 入栈左括号 } else { // 右括号的情况 if (top == -1) return false; // 栈为空则不匹配 char left = stack[top--]; if ((left == '(' && s[i] != ')') || (left == '{' && s[i] != '}') || (left == '[' && s[i] != ']')) { return false; // 不匹配返回false } } } return top == -1; // 栈空表示完全匹配 } int main() { const char* test_str = "{[]}"; if (isValid(test_str)) { printf("%s 是有效的括号序列\n", test_str); } else { printf("%s 不是有效的括号序列\n", test_str); } return 0; } ``` 这段代码实现了对任意长度括号串的合法性检测功能。 --- #### 查找链表倒数第 k 个节点 当面对单向链表的操作需求时,采用双指针技巧是一种优雅而高效的策略[^4]。具体做法如下所示: ```c #include <stdlib.h> // 定义链表结点结构体 typedef struct ListNode { int val; struct ListNode* next; } ListNode; ListNode* findKthToTail(ListNode* head, int k) { if (head == NULL || k <= 0) return NULL; ListNode* pAhead = head; ListNode* pBehind = head; // 让pAhead先走k步 while (k--) { if (pAhead == NULL) return NULL; // 如果不足k个节点直接返回NULL pAhead = pAhead->next; } // 同时移动两个指针直到前面那个到达末尾 while (pAhead != NULL) { pAhead = pAhead->next; pBehind = pBehind->next; } return pBehind; // 此时pBehind指向的就是倒数第k个节点 } void freeList(ListNode* node) { while (node != NULL) { ListNode* temp = node; node = node->next; free(temp); } } int main() { // 构造测试用链表... ListNode* list = malloc(sizeof(ListNode)); list->val = 1; list->next = malloc(sizeof(ListNode)); list->next->val = 2; list->next->next = NULL; ListNode* result = findKthToTail(list, 2); if (result != NULL) { printf("找到倒数第二个节点值为:%d\n", result->val); } else { printf("未找到符合条件的节点。\n"); } freeList(list); return 0; } ``` 以上代码提供了查找链表倒数第 K 个节点的功能,并附带释放动态分配内存的方法。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值