(编程训练)再回首,数据结构——使用栈判断括号匹配

本文介绍了一个简单的算法,用于判断输入表达式中的圆括号是否正确配对。该算法使用了链式栈结构来实现,并提供了完整的C++代码示例。适合初学者学习数据结构和算法实现。

       最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会。


       希望这些能提供给初学者一些参考。

 

      在VC++6.0下可运行,当初还写了不少注释。

 

/*
 **********************************************************
 * 3-2
 * 输入任一表达式,“#”为表达式的结束符,试写一判断式中
 * 圆括号("(", ")")是否配对的算法。
 **********************************************************
 */
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

/*数据类型*/
typedef struct snode
{
	char data;
	struct snode *next;
}StackNode;

typedef StackNode *LinkStack;

/*初始化堆栈*/
LinkStack StackInit()
{
	LinkStack s;
	s = (LinkStack)malloc(sizeof(StackNode));
	s->next = 0;
	return s;
}

/*判断栈s是否为空*/
int StackEmpty (LinkStack s)
{
	if (s->next)
		return 0;
	else
		return 1;
}

/*进栈*/
void Push (LinkStack s, char e)
{
	LinkStack p;
	p = (StackNode *)malloc(sizeof(StackNode));
	p->data = e;
	p->next = s->next;
	s->next = p;
}

/*出栈*/
char Pop (LinkStack s)
{
	char e;
	LinkStack p;
	if (StackEmpty(s))
		return ('\0');
	else
	{
		p = s->next;
		s->next = p->next;
		e = p->data;
		free(p);
		return e;
	}
}

/*接受输入字符串*/
void EnterStr (char str[])
{
	printf ("Input the expression string ended with'#'(length <= 80):\n");
	scanf("%s", str);
}

/*判断字符串中的括号是否匹配*/
int Judge (char str[])
{
	int i = 0;
	LinkStack s;
	s = StackInit();
	while (str[i] != '#')
	switch(str[i])
	{
		case'(':
			{
				Push(s, '(');
				i++;
				break;
			}
		case')':
			{
				if (Pop(s) == '(')
				{
					i++;
					break;
				}
				else
					return 0;
			}
		default:
			i++;
			break;
	}
	if (StackEmpty(s))
		return 1;
	else
		return 0;
}

/*main函数*/
int main()
{
	char ch, str[80];
	int flag = 1;
	while (flag)
	{
		EnterStr(str);
		if (Judge(str))
			printf ("Matched\n");
		else
			printf ("Unmatched\n");
		printf ("\n Do you want to continue?(Y/N):\n");
		scanf (" %c", &ch);
		//scanf ("%c", &ch);
		if ('n' == ch || 'N' == ch)
			flag = 0;
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值