C语言 栈的应用----括号的匹配

简单干脆直奔主题:

代码实现的功能就是对括号的匹配工作,原理就是利用了栈的基本性质,先让“(” “{” “[” 进入栈,当不是以上三个括号时,弹出栈顶符号判断是否与当前符合匹配;

注意:

在本此代码中引用了字符串的相关概念,有兴趣的同学可以网上查找相关理论。eg:用指针变量存储字符串;

/*
	括号匹配问题;(栈)
*/ 
#include <stdio.h>		//引用 输入(scanf)、输出(printf)函数的头文件; 
#include <stdlib.h>		//引用 malloc free函数的头文件; 
//定义栈的结构;
typedef struct LinkNode{
	char data;			//存放数据元素;
	LinkNode *next;		//指针域; 
}LinkNode, *LinkStack;

//初始化栈;
void InitStack(LinkStack &S)
{
	S = NULL;
}

//判断栈空; 
bool EmptyStack(LinkStack S)
{
	if (S == NULL)
		return true;
	else
		return false;
}

//新增元素:入栈;-->单链表的前插操作;
void InsertStack(LinkStack &S,char str)
{
	LinkNode *p = (LinkNode *)malloc(sizeof(LinkNode));
	//printf("input what you want to insert:");
	//scanf("%s",p->data);
	p->data = str;
	//strcpy(p->data,str);
	p->next = S;
	S = p;
}

//删除元素:出栈;
bool DeleteStack(LinkStack &S,char &elem){
	if (EmptyStack(S))		//栈空报错; 
		return false;
	LinkNode *p = S;		//定义要删除的结点; 
	//printf("the Elem is Deleted: %s",p->data); 
	elem = p->data;
	S = p->next;
	free(p);
	return true;
}

int main() {
	//首先初始化栈;
	printf("The main function is:\n");
	printf("栈的应用----括号的匹配(英文状态)\n");
	LinkStack S;	
	InitStack(S);			//初始化栈;
	//定义一个指针变量,存放字符串数组的首地址; 
	char *str = (char *)malloc(sizeof(char));	 
	printf("input a string:");
	scanf("%s",str);
	//循环判断元素是否为空; 
	while(*str){
		//有*,输出指针所指内容;没有*,输出10进制地址所对应的字符; 
		//printf("%c",*str);	
		if (*str == '(' or *str == '[' or *str == '{')
			InsertStack(S,*str);	//将左括号在内的元素进栈; 
		else{
			if (EmptyStack(S))			//栈中没有左括号,匹配失败; 
			{
				printf("There is not '(' or '[' or '{' ");
				return 1;
			}
			char elem;				//定义一个字符串,记录当前要出栈的元素; 
			DeleteStack(S,elem);	//栈顶元素出栈; 
			//分别判断出栈元素与当前符号是否匹配;
			if (elem != '(' and *str == ')')
			{
				printf("Matching failed('(')!");
				return 0;
			}
			if (elem != '[' and *str == ']')
			{
				printf("Matching failed('[')!");
				return 0;
			}
			if (elem != '{' and *str == '}')
			{
				printf("Matching failed('{')!");
				return 0;
			}				
		}
		*str++;			//指针加1;指向下一个元素; 
	}
	if (!EmptyStack(S))	//若此时栈中还有元素,则匹配失败;
	{
		printf("Matching failed!");
		return 1; 
	}			 
	printf("Successful!!!");
	return 0;
}

写在最后面:
代码如有不足之处,留言相互学习

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值