1. 程式人生 > >棧的經典用法——判斷括號是否匹配

棧的經典用法——判斷括號是否匹配

#簡單說明棧的特徵: 本處使用順序棧判斷括號匹配,首先我們知道棧是一種只能在一段操作的線性表。其插入,刪除僅能在一端進行操作,就像一個瓶子一樣,不管是取東西還是放東西都只能在瓶口進行,那麼最後最先進棧的元素就一定是最後出棧的元素。利用這一特性,我們就可以判斷括號是否匹配了。

#主要思路如下: 我們從左到右依次掃描需要判斷的字串,遇見“(”,“{”,“[”就入棧,遇見“)”,“]”,“]”就出棧。若三種左括號沒有全部入棧便碰到了右括號那顯然不匹配。碰到左括號進棧,碰到與其相匹配的右括號時出棧,當字串掃描到‘\0’,並且此時棧為空則括號匹配,否則不匹配。

#建立順序棧

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

#define MAXSIZE 100

typedef char datatype;
//建立stack
typedef struct 
{
    datatype data[MAXSIZE];
    int top;
}SeqStack;

//初始化stack
void Init_SeqStack(SeqStack **s)
{
//這裡需要使用二級指標,只有通過二級指標或返回指標的函式才可在主調函式中訪問到被調函式中生成的線性表,初學者尤其注意
    *s=(SeqStack*)malloc(sizeof(SeqStack));
    (*s)->top=-1;
}

//判空,空則返回1
int Empty_SeqStack(SeqStack *s)
{
    if(s->top==-1) return 1;
    else return 0;
}

void Push_SeqStack(SeqStack *s,datatype x)
{
    if(s->top==MAXSIZE-1)
        puts("the stack is full!");//有換行符
    else
    {
        s-> top++;
        s->data[s->top]=x;
    }
}

void Pop_SeqStack(SeqStack *s)
{
    if(s->top==-1)  puts("the stack is empty!");
    else   s->top--;
}

#判斷是否匹配的函式

void Match_SeqStack(SeqStack *s,datatype test[])
{
    int i=0;
    while(test[i]!='\0')
    {
    //遇見左括號入棧
        if(test[i]=='('||test[i]=='['||test[i]=='{')
            {
                Push_SeqStack(s,test[i]);
                i++;
                continue;
                //每入棧一個元素就進行下一次迴圈,掃描下一個字元
            }
            //當遇見匹配的右括號時,則將棧頂左括號出棧
           //用if....... else if...... if 的結構保證每掃描到一個匹配的右括號
           //只有一個匹配的字元出棧,每執行完一個判斷框之後的程式則continue進行下一次迴圈
                if(test[i]==')'&&s->data[s->top]=='(')
               {
                           Pop_SeqStack(s);
                           i++;
                           continue;
               }
                else if(test[i]==']'&&s->data[s->top]=='[')
               {
                           Pop_SeqStack(s);
                           i++;
                           continue;
               }
               else if(test[i]=='}'&&s->data[s->top]=='{')
               {
                           Pop_SeqStack(s);
                           i++;
                           continue;
               }
               else break;
    }
    //防止不是因為掃描完而退出迴圈
    if(Empty_SeqStack(s)&&test[i]=='\0')  printf("match!\n");
        else printf("don't match!\n");
}

#main函式部分

int main()
{
    int i=0;
    SeqStack *s;
    datatype test[20];
    Init_SeqStack(&s);
    puts("please input the brackets you want test:");
    scanf("%s",test);
    Match_SeqStack(s,test);
    return 0;
}

這是我的第一篇blog 目前還在學習階段 希望能通過寫部落格來總結學習過程中的錯誤,經驗 並且可以幫助到更多的初學者