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

实现思路
- 读入文件挨个字符遍历直到 
\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 协议》,转载必须注明作者和本文链接
          
                    
                    
          
          
                关于 LearnKu
              
                    
                    
                    
 
推荐文章: