1. 程式人生 > >【面試題】用棧解決括號匹配問題

【面試題】用棧解決括號匹配問題

思想:在表示式中,相同型別的括號(包括:()、[]、{})是成對出現的,並且當括號在表示式中巢狀時,不允許出現交叉現象
檢驗括號匹配的方法,就是對給定的字串依次檢驗:若是左括號,入棧;若是又括號,出棧一個左括號判斷是否與之匹配;是其他字元,不檢驗。檢驗到字串尾,還要檢查棧是否為空。只有棧空,整個字串才是括號匹配的

程式碼如下:

#include "stdafx.h"
#include
#include
#include

using namespace std;

#define stacksize 100   //定義棧的空間大小

struct stack{      //定義棧的結構體
     char
strstack[stacksize];//定義棧的儲存格式為字元型 int top; //定義棧的棧頂變數 }; void InitStack(stack &s){ //定義一個新棧s,初始化棧頂為-1 s.top=-1; } char Push(stack &s, char a){ //入棧操作,將字元a入棧s if(s.top==stacksize-1) //當棧頂為棧空間大小-1,棧滿 return 0; s.top++; //入棧操作一次,棧頂+1 s.strstack[s.top]=a; //此時,棧頂元素為字元a
return a; } char Pop(stack &s){ //出棧操作 if(s.top==-1) //當棧頂為-1時,棧空 return 0; char a=s.strstack[s.top]; //將棧頂元素賦予字元a,並返回字元a,完成出棧操作 s.top--; return a; } int Empty(stack &s,int re){ //定義判斷棧是否為空的函式 if(s.top==-1) return 1;//棧為空時返回值為1 else return
0; //棧不為空時返回值為0 } int Check(char * str){ //檢查括號是否匹配的函式 stack s; InitStack(s); int strn=strlen(str); //定義字串長度為strn for(int i=0;i { char a=str[i]; switch(a){//對輸入的字元a進行判斷 case '(': case '[': case '{': Push(s,a);//若是左括號,則進行入棧操作 break; //若是右括號,則進行出棧操作,若出棧元素不是與輸入相對應的左括號,則字串括號中不匹配,返回 case ')': if(Pop(s)!='(') return 0; break; case '}': if(Pop(s)!='{') reutn 0; break; case ']': if(Pop(s)!=']') return 0; break; } } int re=0;//定義並初始化判斷函式的返回值 re=Empty(s,re);//返回盤空函式的返回值 if(re==1) return 1;//棧為空 else return 0;//棧不為空,有左括號,即存在‘(’或'['或'{'未匹配 } int main() //主函式 { char str[100]; //定義一個單字元陣列以儲存鍵盤輸入的字串。 cout<<"請您輸入一個長度小於100的字串:"<<endl; cin>>str; //從鍵盤輸入字元儲存到字元陣列中,有輸入則繼續。 int re=Check(str); if(re==1) cout<<"您輸入的字串中的括號完全匹配!"<<endl; else if(re==0) cout<<"您輸入的字串中的括號不匹配!"<<endl; }