栈的应用-括号匹配

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

#define STACK_MAX_SIZE 10

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

void outputStack(CharStackPtr paraStack)
{
	for(int 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)
{
	if(paraStackPtr->top >=STACK_MAX_SIZE-1)
	{
		printf("Cannot push element: stack full.\r\n");
		return;
	}
	
	paraStackPtr->top ++;
	
	paraStackPtr->data[paraStackPtr->top]=paraValue;
}

char pop(CharStackPtr paraStackPtr)
{
	if(paraStackPtr->top <0)
	{
		printf("Cannot pop element: stack empty.\r\n");
		return '\0';
	}
	
	paraStackPtr->top --;
	
	return paraStackPtr->data[paraStackPtr->top +1];
}

void pushPopTest()
{
	printf("---- pushPopTest begins. ----");
	char ch;
	
	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(int i=0;i<3;i++)
	{
		ch=pop(tempStack);
		printf("Pop %c.\r\n",ch);
		outputStack(tempStack);
	}
	
	printf("---- pushPopTest ends. ----\r\n");
}

bool bracketMatching(char* paraString,int paraLength)
{
	CharStackPtr tempStack=charStackInit();
	push(tempStack,'#');
	char tempChar,tempPopedChar;
	
	for(int 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;
			default:
				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\n",tempExpression,tempMatch);
		
	tempExpression=")(";
	tempMatch=bracketMatching(tempExpression,2);
	printf("Is the expression '%s' bracket matching? %d \r\n",tempExpression,tempMatch);
	
}

int main()
{
	bracketMatchingTest();
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值