#include <stdio.h>#include <string.h>#include <stdbool.h>#define MAX_LEN 102// 定义逻辑联结词的优先级int priority(char c){	switch(c){		case '!':return 2;		case '-':		case '^':		case '|':		case '<':return 1;	}	return 0;}//中间栈 typedef struct {    int top;    int data[MAX_LEN];} Stack;// 根据逻辑联结词计算表达式的值bool calc(char op, bool a, bool b) {    switch (op) {        case '!': return !b;        case '^': return b&&a;        case '|': return b||a;        case '-': return !b || a;        case '<': return b==a;        default: return false; // 不应该执行到这里    }}int main() {    char expr[MAX_LEN]; // 存储输入的逻辑表达式    char chex[MAX_LEN];//储存后缀表达式 	int num=0;//记录后缀表达式数量     int var_count; // 记录变量种类数    char vars[11]; // 存储变量名    int var_value[10]; // 存储变量对应的真值    Stack s;     while (fgets(expr, MAX_LEN, stdin) != NULL) {        // 去除换行符        expr[strlen(expr) - 1] = '\0';                s.top=-1;        // 统计变量个数和变量名        var_count = 0;        for (int i = 0; i < strlen(expr); i++) {            if (expr[i] >= 'a' && expr[i] <= 'z') {                bool found = false;                for (int j = 0; j < var_count; j++) {                    if (vars[j] == expr[i]) {                        found = true;                        break;                    }                }                if (!found) {                    vars[var_count++] = expr[i];                }            }        }        // 输出变量名        for (int i = 0; i < var_count; i++) {            printf("%c ", vars[i]);        }				// 输出表达式本身        printf("%s\n", expr);                //中缀转后缀         for(int i=0;expr[i] != '\n';i++){        	if(expr[i]==' ')continue;        	else		    if(expr[i]>='a'&&expr[i] <='z') chex[num++]=expr[i] ;		    else if(s.top==-1&&(expr[i]=='!'||expr[i]=='-'||expr[i]=='|'||expr[i]=='<'||expr[i]=='^')){		    s.data[++s.top]=expr[i];			if(expr[i]=='-'||expr[i]=='|')i++;			if(expr[i]=='<')i+=2;		} 		    else if(expr[i]== '(' ) s.data[++s.top]=expr[i];	     	else if(expr[i]==')'){			       while(s.data[s.top]!='('&&s.top!=-1) chex[num++]=s.data[s.top--];			       s.top--;		}      		else {			while(priority(expr[i])<=priority(s.data[s.top])&&s.top!=-1&&s.data[s.top]!='('){			    chex[num++]=s.data[s.top--];		    }		    s.data[++s.top]=expr[i];		}		    }	    while(s.top!=-1) chex[num++]=s.data[s.top--];	        // 计算真值表        int row_count = 1 << var_count;        for (int i = row_count-1; i >= 0; i--) {            // 初始化变量的真值            for (int j = 0; j < var_count; j++) {                var_value[j] = ((i >> (var_count - j - 1)) & 1);            }            // 计算后缀表达式的值            for (int j = 0; j < strlen(chex); j++) {                if (chex[j] >= 'a' && chex[j] <= 'z') { // 是变量名，直接入栈对应的真值                    for (int k = 0; k < var_count; k++) {                        if (vars[k] == chex[j]) {                            s.data[++s.top] = var_value[k];                            break;                        }                    }                } else  if (chex[j] == '^' || chex[j] == '-' ||chex[j] == '<' || chex[j] == '|'||chex[j] == '!') { // 如果是运算符，从栈中弹出两个操作数进行运算，并将结果入栈                           bool a = s.data[s.top--];                           bool b = s.data[s.top--];                                                      s.data[++s.top]=calc(chex[j], a, b) ;                }             }            for (int j = 0; j < var_count; j++) {                printf("%d ", var_value[j]);            }            printf("%d\n", s.data[0]);        }       }    return 0;}这段代码为什么运行后输入，不输出？