棧的應用之平衡符號 【資料結構與演算法分析 c 語言描述】

jerrkill發表於2018-12-26

描述

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

高度自律,深度思考,以勤補拙

相關文章