【面試題】用棧解決括號匹配問題
阿新 • • 發佈:2018-12-26
思想:在表示式中,相同型別的括號(包括:()、[]、{})是成對出現的,並且當括號在表示式中巢狀時,不允許出現交叉現象。
檢驗括號匹配的方法,就是對給定的字串依次檢驗:若是左括號,入棧;若是又括號,出棧一個左括號判斷是否與之匹配;是其他字元,不檢驗。檢驗到字串尾,還要檢查棧是否為空。只有棧空,整個字串才是括號匹配的。
程式碼如下:
#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;
}