平衡符号——栈实现

如果符号比对完就输出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);/*然后再删除该结构的分配的内存*/
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值