棧是一種先進後出的結構,它在程序設計中有很多的應用,今天咱們介紹一下棧應用於括號匹配的問題
有一行括號序列輸入數據是一個字符串S(S的長度小於100,且S不是空串),數據保證S中只含有”[“,”]”,”(“,”)”四種字符
如果字符串中所含的括號是配對的,則輸出YES!,如果不配對則輸出NO!
分析:
首先咱們先將輸入的字符串輸入到一個字符數組中,然後依次入棧,若下一次輸入的括號剛好能和棧頂的括號匹配,則將棧頂的元素出棧,若本次輸入的括號和棧頂元素不匹配則將本次元素入棧。
最後檢查棧是否爲空,如果棧是空的則說明括號匹配,如果非空則括號不匹配。
#include<iostream>
using namespace std;
#include<assert.h>
#define SIZE 100
typedef struct stack //定義一個棧
{
int size; //棧的容量
char* arr; //存儲數據的容器
int top; //棧頂
}stack;
void init(stack* p) //棧的初始化
{
p->size=SIZE;
assert((p->arr=(char*)malloc(SIZE))!=NULL); //爲容器分配大小
p->top=0;
}
void push(stack* p,char c)
{
assert(p->top!=p->size); //此處使用了斷言(assert的頭文件爲assert.h)
p->arr[p->top++]=c;
}
void pop(stack* p)
{
assert(p->top!=0);
p->top--;
}
void input(stack* p)
{
char arr[SIZE];
cin>>arr; //輸入待檢測的括號串
int i=0;
p->arr[p->top++]=arr[i++];
while(arr[i]!='\0')
{
if((arr[i]==')'&&p->arr[p->top-1]=='(')||(arr[i]==']'&&p->arr[p->top-1]=='['))
{
pop(p); //若待入棧的和棧頂元素匹配,放棄入棧,並將棧頂元素出棧
}
else
push(p,arr[i]); //若不匹配,則正常入棧
i++;
}
}
void check(stack* p) //檢測棧是否爲空,並輸出結果
{
if(p->top==0)
cout<<"YES!"<<endl;
else
cout<<"NO!"<<endl;
}
int main()
{
stack p; //創建一個棧
init(&p); //將棧初始化
input(&p); //前面分析部分的代碼實現
check(&p); //判斷棧是否爲空
}
放截圖給大家看看吧