栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

栈的应用 括号匹配

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

栈的应用 括号匹配

关于栈的应用 (括号匹配) 对于一个字符串 用栈的数据结构去判断括号是否匹配 这是对栈的应用 也是对栈理解的更一步深入 定义结构体
typedef struct CharStack {
	int top;
	//栈顶参数

	int data[STACK_MAX_SIZE]; 
	//栈数组

} *CharStackPtr;


打印栈
void outputStack(CharStackPtr paraStack) {
	//循环打印栈

	for (int i = 0; i <= paraStack->top; i ++) {

		printf("%c ", paraStack->data[i]);
	}

	printf("rn");
}

申请空间栈
CharStackPtr charStackInit() {
	//动态开辟天地

	CharStackPtr resultPtr = (CharStackPtr)malloc(sizeof(struct CharStack));
	resultPtr->top = -1;//-1尾巴


	return resultPtr;
}

存放数据
void push(CharStackPtr paraStackPtr, int paraValue) {

	//一样存储数据

	if (paraStackPtr->top >= STACK_MAX_SIZE - 1) {
		printf("Cannot push element: stack full.rn");
		return;
	}//Of if

	// 栈顶数量++
	paraStackPtr->top ++;

	// 存储

	paraStackPtr->data[paraStackPtr->top] = paraValue;
}
取出数据
char pop(CharStackPtr paraStackPtr) {
	// 判断是否合法取数据

	if (paraStackPtr->top < 0) {
		printf("Cannot pop element: stack empty.rn");
		return '';
	}

	//取出数量--

	paraStackPtr->top --;

	// 打印数据

	return paraStackPtr->data[paraStackPtr->top + 1];
}



存放取出测试
void pushPopTest() {
	printf("---- pushPopTest begins. ----rn");


	CharStackPtr tempStack = charStackInit();
	printf("After initialization, the stack is: ");
	outputStack(tempStack);



	for (char ch = 'a'; ch < 'm'; ch ++) {

		printf("Pushing %c.rn", ch);
		push(tempStack, ch);
		outputStack(tempStack);
	}


	for (int i = 0; i < 3; i ++) {

		char ch = pop(tempStack);
		printf("Pop %c.rn", ch);
		outputStack(tempStack);
	}

	printf("---- pushPopTest ends. ----rn");
}


重头戏----括号匹配代码
 
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 true;
	} 
    //成功匹配返回1
    
	return true;
}


括号匹配测试代码
void bracketMatchingTest() {
	char *tempExpression = "[2 + (1 - 3)] * 4";
	bool tempMatch = bracketMatching(tempExpression, 17);
	printf("Is the expression '%s' bracket matching? %d rn", tempExpression, tempMatch);


	tempExpression = "( )  )";
	tempMatch = bracketMatching(tempExpression, 6);
	printf("Is the expression '%s' bracket matching? %d rn", tempExpression, tempMatch);

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

	tempExpression = "({}[])";
	tempMatch = bracketMatching(tempExpression, 6);
	printf("Is the expression '%s' bracket matching? %d rn", tempExpression, tempMatch);


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


int main() {

	bracketMatchingTest();
}

运行截图

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/869374.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号