棧應用於括號匹配

棧是一種先進後出的結構,它在程序設計中有很多的應用,今天咱們介紹一下棧應用於括號匹配的問題


有一行括號序列輸入數據是一個字符串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);         //判斷棧是否爲空
}

放截圖給大家看看吧
結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章