堆栈判断文本括弧是否对称

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define Maxsize 10
typedef  char elemtype;
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;

typedef struct Node
{
	elemtype ch;
	Stack next;
}Node;

Stack CreateStack(void)
{
	Stack s;
	s = (Stack)malloc(sizeof(Node));
	if(!s)
		printf("Out Of Space\n");
	s->next = NULL;
	return s;
}

int IsEmpty(Stack s)
{
	if(s->next == NULL)
		return 0;                          //0代表栈为空
	return 1;                              //1代表栈非空
}

void Push(Stack s,elemtype x)
{
	while(s->next != NULL)
	{
		s = s->next;
	}
	//s->ch = x;
	Stack tmp;
	tmp = (Stack)malloc(sizeof(Node));
	if(!tmp)
	{
		printf("Out of space\n");
		exit(1);
	}
	tmp->ch = x;
	s->next = tmp;
	tmp->next = NULL;
}

elemtype Top(Stack s)
{
	if(!IsEmpty(s))
	{
		printf("栈以空\n");
		return NULL;
	}
	while(s->next->next != NULL)
	{
		s = s->next;
	}
	elemtype x = s->next->ch;
	free(s->next);
	s->next = NULL;
	return x;
}

void MakeEmpty(Stack s)
{
	if(!IsEmpty(s))
		free(s);
	while(s!=NULL)
	{
		while(!s->next->next == NULL)
		{
			free(s->next);
			s->next = NULL;
		}
	}
}

int main(void)
{
	Stack s;
	s = CreateStack();
	char a[Maxsize];

	while(scanf("%s",a)!=EOF)
	{
		int len = strlen(a);
		for(int i=0;i < len;i ++)
		{
			if(a[i] == '(' || a[i] == '[' || a[i] == '{')
				Push(s,a[i]);
			if(a[i] == ')' || a[i] == ']' || a[i] == '}')
			{
				char ch = Top(s);
				if(a[i] == '}'&&ch != '{')
				{
					printf("No\n");
					i = len;
				}
				if(a[i] == ']'&&ch != '[')
				{
					printf("No\n");
					i = len;
				}
				if(a[i] == ')'&&ch != '(')
				{
					printf("No\n");
					i = len;
				}
			}
		}
		if(!IsEmpty(s))
			printf("Yes\n");
		else
			printf("No\n");
	}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值