如果符号比对完就输出1,没有比对完输出Not empty.
EOF为结束符.Windows里面为CTRL + Z为结束也就是下面截图里面的~z这种符号
cu_fu=0表示多一个字符比如 (())] 这种就不会输出1,你去掉cu_fu=0这个就会输出1
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define OFTEN (-1)
#define ZERO_VALUE (15)
struct Stack {
int unstack;/*栈的容量*/
int op_stack;/*栈的角标*/
char* stack_t;
};
typedef struct Stack* Stack_t;
Stack_t av_stack();
void Posh(Stack_t stacks,int ch);
void StackArray(Stack_t stacks);
void DeleteStack(Stack_t stacks);
bool Cstack(Stack_t stacks);
bool StackThen(Stack_t stacks);
int Pop(Stack_t stacks);
int Top(Stack_t stacks);
int main(void) {
Stack_t stacks;
stacks = av_stack();
int ch,cu_fu=0;
while ((ch = getchar()) != EOF) {
if (ch == '(' || ch == '[' || ch == '{') {
Posh(stacks, ch);/*压入栈中*/
}
/*之所以不是else 而是因为不用管那些abcd这些其他的字符*/
else if(ch==')'||ch==']'||ch=='}') {
cu_fu = Top(stacks);
if (cu_fu == ch - 2 || cu_fu == ch - 1&& cu_fu != 0) {
Pop(stacks);
continue;
}
else break;
}
}
if (StackThen(stacks)&&cu_fu!=0) {/*如果栈为空表示已经成功比对(打印1)*/
puts("1");
}
else {/*栈不为空(打印Not empty)_清空栈*/
printf("Not empty\n");
StackArray(stacks);
}
DeleteStack(stacks);
}
/*检查栈是否已满*/
bool Cstack(Stack_t stacks) {
return stacks->op_stack + 1 == stacks->unstack;
}
/*检查栈是否为空*/
bool StackThen(Stack_t stacks) {
return stacks->op_stack == OFTEN;
}
/*创建栈*/
Stack_t av_stack() {
Stack_t stacks = (Stack_t)malloc(sizeof(struct Stack));
stacks->stack_t = (char*)malloc(sizeof(char)* ZERO_VALUE);
stacks->op_stack = OFTEN;
stacks->unstack = ZERO_VALUE;
return stacks;
}
/*压栈*/
void Posh(Stack_t stacks, int ch) {
if (Cstack(stacks)) {
printf("栈已满\n");
return;
}
stacks->stack_t[++stacks->op_stack] = ch;
}
/*出栈*/
int Pop(Stack_t stacks) {
if (StackThen(stacks)) {
printf("栈为空\n");
exit(1);
}
return stacks->stack_t[stacks->op_stack--];
}
/*查看栈顶*/
int Top(Stack_t stacks) {
if (StackThen(stacks)) {
return 0;
}
return stacks->stack_t[stacks->op_stack];
}
/*清空栈*/
void StackArray(Stack_t stacks) {
stacks->op_stack = OFTEN;
}
/*删除栈*/
void DeleteStack(Stack_t stacks) {
free(stacks->stack_t);/*先删除结构里面给指针分配的内存*/
free(stacks);/*然后再删除该结构的分配的内存*/
}