栈的应用--括号匹配(作业)

文章提供了一段C语言代码,用于创建和操作一个字符栈,并实现括号匹配的功能。代码首先定义了栈的数据结构,然后通过压栈、弹栈操作进行括号的匹配检查,确保括号正确配对。最后,通过几个测试用例验证了括号匹配函数的正确性。
摘要由CSDN通过智能技术生成

代码:

#include<stdio.h>
#include<malloc.h>
#include<stdbool.h>

#define STACK_MAX_SIZE 10

typedef struct CharStack
{
	int top;
	int data[STACK_MAX_SIZE]; 
}*CharStackPtr;

//打印栈 
void outputStack(CharStackPtr paraStack)
{
	int i;
	for(i=0;i<=paraStack->top;i++)
	{
		printf("%c ",paraStack->data[i]);
	}
	printf("\r\n");
}

//初始化一个空的字符栈
CharStackPtr charStackInit()
{
	CharStackPtr resultPtr=(CharStackPtr)malloc(sizeof(struct CharStack));
	resultPtr->top=-1;
	
	return resultPtr;	
} 

//压一个元素入栈
void push(CharStackPtr paraStackPtr,int paraValue)
{
	//1.空间检查
	if(paraStackPtr->top>=STACK_MAX_SIZE-1)
	{
		printf("Cannot push element: stack full.\r\n");
		return;
	}
		
	//2.更新栈顶
	paraStackPtr->top++;
	
	//3.压元素入栈
	paraStackPtr->data[paraStackPtr->top]=paraValue; 
} 

//弹一个元素出栈
char pop(CharStackPtr paraStackPtr)
{
	//1.空间检查
	if(paraStackPtr->top<0)
	{
		printf("Cannot pop element: stack empty.\r\n");
		return '\0';
	}
	
	//2.更新栈顶
	paraStackPtr->top--;
	
	//3.取元素
	return paraStackPtr->data[paraStackPtr->top+1]; 
} 

//
void pushPopTest()
{
	printf("---- pushPopTest begins. ----\r\n");
	char ch;
	int i;
	
	//初始化
	CharStackPtr tempStack=charStackInit();
	printf("After initialization, the stack is: ");
	outputStack(tempStack);
	
	//入栈
	for(ch='a';ch<'m';ch++)
	{
		printf("Pushing %c.\r\n",ch);
		push(tempStack,ch);
		outputStack(tempStack);
	}
	
	//出栈
	for(i=0;i<3;i++)
	{
		ch=pop(tempStack);
		printf("Pop %c.\r\n",ch);
		outputStack(tempStack);
	}
	
	printf("---- pushPopTest end. ----\r\n");
}

//利用栈匹配括号
bool bracketMatching(char* paraString,int paraLength)
{
	//1.在栈底压入'#'来初始化栈
	CharStackPtr tempStack=charStackInit();
	int i;
	push(tempStack,'#');
	char tempChar,tempPopedChar;
	
	//2.处理串
	for(i=0;i<paraLength;i++)
	{
		tempChar=paraString[i];
		switch(tempChar)
		{
			case '(':
			case '[':
			case '{':
				push(tempStack,tempChar);
				break;
			case ')':
				tempPopedChar=pop(tempStack);
				if(tempPopedChar!='(')
				{
					return false;
				}
				break;
			case ']':
				tempPopedChar=pop(tempStack);
				if(tempPopedChar!='[')
				{
					return false;
				}
				break;
			case '}':
				tempPopedChar=pop(tempStack);
				if(tempPopedChar!='{')
				{
					return false;
				}
				break;
		}
	}
	tempPopedChar=pop(tempStack);
	if(tempPopedChar!='#')
	{
		return false;
	}
	return true;
}

//代码测试
void bracketMatchingTest()
{
	char* tempExpression="[2+(1-3)*4]";
	bool tempMatch=bracketMatching(tempExpression,17);
	printf("Is the expression '%s' bracket matching? %d \r\n",tempExpression,tempMatch);
	
	tempExpression="( )  )";
	tempMatch=bracketMatching(tempExpression,6);
	printf("Is the expression '%s' bracket matching? %d \r\n",tempExpression,tempMatch);

	tempExpression="()()(())";
	tempMatch=bracketMatching(tempExpression,8);
	printf("Is the expression '%s' bracket matching? %d \r\n",tempExpression,tempMatch);

	tempExpression="({}[])";
	tempMatch=bracketMatching(tempExpression,6);
	printf("Is the expression '%s' bracket matching? %d \r\![在这里插入图片描述](https://img-blog.csdnimg.cn/94988d6cbffb466e822759745d663bf0.jpeg#pic_center)
n",tempExpression,tempMatch);

	tempExpression=")(";
	tempMatch=bracketMatching(tempExpression,2);
	printf("Is the expression '%s' bracket matching? %d \r\n",tempExpression,tempMatch);
}

//程序执行入口
void main()
{
	bracketMatchingTest();
}

运行结果:
在这里插入图片描述
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值