1. 程式人生 > >棧應用:判斷字串中括號是否成對出現

棧應用:判斷字串中括號是否成對出現

練習題目

利用棧先將後出的特性,判斷字串中的數字表達式括號是否成對匹配,如果沒有給出錯誤位置資訊提示

程式碼實現

程式碼思路很簡單,如果是左括號將左括號 就入棧,遇到右括號 棧中的左括號出棧。如果該出棧的時候,棧空 肯定匹配錯誤。還有就是表示式遍歷完畢,我們的棧 如果是全部匹配成功 ,棧肯定為空,不為空 匹配錯誤!這裡我們使用之前寫的順序棧,不清楚的可以看:線性表:順序棧演算法實現

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "SeqStack.h"

//列印錯誤資訊
void PrintError(char* str,char* errMsg,char* ch)
{
	printf("錯誤資訊:%s\n", errMsg);
	printf("%s\n",str);
	int num = ch - str;
	for (int i = 0; i < num; i++)
	{
		printf(" ");
	}
	printf("^\n");
}
/*
利用棧 判斷表示式中括號是否成對出現,如果沒有完全匹配,列印錯誤資訊。
*/
void BracketMatch()
{
	char* dest = "1+3+2*(1-5)+5-3(+(1+3(+";
	char* str = dest;
	SeqStack stack = Init_SeqStack();
	char* ch;
	while (*str)
	{
		//遇到左括號,入棧
		if (*str == '(')
		{
			Push_SeqStack(stack, str);
		}
		//遇到右括號,出棧進行匹配
		if (*str==')')
		{
			if (IsEmpty_SeqStack(stack))
			{
				PrintError(dest, "右括號匹配失敗", str);
				break;
			}
			else
			{
				Pop_SeqStack(stack);
			}
		}
		str++;
	}
	//遍歷完畢 棧空括號表示式正確
	if (IsEmpty_SeqStack(stack))
	{
		printf("括號表示式正確\n");
	}
	else
	{
		while (!IsEmpty_SeqStack(stack))
		{
			ch = Pop_SeqStack(stack);
			PrintError(dest, "左括號匹配失敗", ch);
		}
	}
	return;
}

int main(int argc, char *argv[])
{
	BracketMatch();
	return 0;
}

執行結果檢測