描述
實現思路
- 讀入檔案挨個字元遍歷直到
\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);
}