栈的应用之平衡符号 【数据结构与算法分析 c 语言描述】

描述

file

实现思路

  • 读入文件挨个字符遍历直到 \0
  • 识别字符。
  • 遇到 { [ ( 入栈。
  • 遇到 } ] ) ,对比栈顶元素,是否成对,是就弹出,否就报错,栈顶为空也报错。
  • 遍历结束,栈非空也报错。

如何识别字符
可以根据 ascii 编码,我这里自己做了两个数组分别存放符号的 “开” 跟 “闭”,用数组下标对应。

具体实现

栈相关代码这里不再给出,有兴趣的去看关于栈的那篇文章
栈 ADT 【数据结构与算法分析 c 语言描述】

/**
 * 栈应用-平衡符号
 */

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

#define error(str) fatal_error(str)
#define fatal_error(str) fprintf(stderr, "%s\n", str),exit(1)

const char close_char[] = ")]}";
const char open_char[] = "([{";

char *file_get_content(char path[]);
int check_symbol(char *path);
int is_close_symbol(char ch);
int is_open_symbol(char ch);
int is_match(char chopen, char chclose);

int main(int argc, char const *argv[])
{
    char path[] = "./stack.c";
    check_symbol(path);
    return 0;
}

int check_symbol(char *path)
{
    FILE *fp = NULL;
    stack stack;
    char ch;
    stack = create_stack();
    fp = fopen(path, "r+");
    if (NULL == fp)
        fatal_error("not a corrent path");
    while ( (ch = fgetc(fp)) != EOF) {
        printf("%c", ch);
        if (is_open_symbol(ch) > -1) {
            push(ch, stack);
        } else if (is_close_symbol(ch) > -1) {
            if ( is_empty( stack ) )
                fatal_error("error1");

            if ( !is_match( top(stack), ch ) )
                fatal_error("error2");

            pop(stack);
        }
    }
    if (!is_empty(stack))
        fatal_error("error");

    fclose(fp);
    dispose_stack(stack);
}

int is_close_symbol(char ch)
{
    int i = 0;
    while (close_char[i] != '\0') {
        if (ch == close_char[i])
            return i;
        i++;
    }
    return -1;
}

int is_open_symbol(char ch)
{
    int i = 0;
    while (open_char[i] != '\0') {
        if (ch == open_char[i])
            return i;
        i++;
    }
    return -1;
}

int is_match(char chopen, char chclose)
{
    return is_open_symbol(chopen) == is_close_symbol(chclose);
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
高度自律,深度思考,以勤补拙
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!