1. 程式人生 > >括號匹配的檢驗

括號匹配的檢驗

       使用棧的結構檢驗一串輸入的括號和中括號是否匹配,只有()和[]一一對應的時候,該串才算正確的串,如:([]())和[([][])]是正確的串,[(])和([())是不正確的。

       首先讀取輸入的串,檢查每個當前元素,如果是(或者[則壓入棧中,是)或]則檢查棧頂元素,如果棧頂元素與當前元素剛好閉合,則將棧頂元素彈出。換而言之,棧中儲存的內容只有(和[,當棧為空,當前元素為)或]即可判斷出當前串不正確。棧為空時串即為正確的串。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define Stack_Init_Size 100
#define Stack_Increment 10
//棧的定義 
typedef struct {
	char* base=NULL;
	char* top;
	int stacksize;
}SqStack;

//初始化棧 
int Init(SqStack &stack){
	if(!stack.base){ 
		stack.base=(char*)malloc(Stack_Init_Size*sizeof(char));
		stack.top=stack.base;
		stack.stacksize = Stack_Init_Size;
		printf("初始化成功\n");
		return 0; //初始化成功 
	}
	else return -1;//表示無法初始化已出始化棧
}

//獲取棧頂資料
char GetTop(SqStack stack){
	if(stack.base==stack.top){
		printf("棧中沒有資料\n");
		return '#';
	}
	printf("獲取棧頂資料成功\n");
	return *(stack.top-1);
} 

//往棧中插入元素
int Push(SqStack &stack,char element){
	if(stack.top-stack.base==stack.stacksize){
		stack.base=(char*)realloc(stack.base,Stack_Increment*sizeof(char));
		stack.top=stack.base+stack.stacksize;
		stack.stacksize+=Stack_Increment;
	}
	*stack.top=element;
	stack.top+=1;
	printf("插入資料成功\n");
	return 0;//表示成功 
} 

//刪除棧頂元素
char Pop(SqStack &stack){
	if(stack.top==stack.base){
		printf("棧為空\n");
		return '#';
	}
	printf("刪除資料成功");
	return *--stack.top;
} 

//釋放棧空間 
int Destroy(SqStack &stack){
	free(stack.base);
	stack.stacksize=0;
	printf("銷燬棧成功\n");
	return 0;
}

//處理資料,藉助棧判斷 
int ExecuteData(SqStack &stack,char* data){
	Push(stack,data[0]);
	for(int i=1;i<strlen(data);i++){
		char top = GetTop(stack);
		switch(top){
			case '(':
				if(data[i]==')')Pop(stack);
				else Push(stack,data[i]);
				break;
			case '[':
				if(data[i]==']')Pop(stack);
				else Push(stack,data[i]);
				break;
			case '#':
				if(data[i]=='('||data[i]=='['){
					Push(stack,data[i]);
					break;
				}
				else  
			default:return -1;break;
		}
	}
	if(stack.top==stack.base){
		Destroy(stack);
		return 0;
	}
	else{
		Destroy(stack);
		return -1;
	}
} 


int main(){
	SqStack stack;
	Init(stack);
	char data[180];
	scanf("%s",data);
	int result = ExecuteData(stack,data);
	if(result==0)printf("括號是正確匹配的\n");
	else printf("括號匹配不正確\n");
	return 0;
}