鏈棧實現括號匹配

鏈棧實現括號匹配

       數據結構中有一種結構叫做棧,它是一種先入後出的結構,通過這個程序的編寫,基本上顛覆了我對於指針的認識,我才發現我對於c語言的指針並沒有深入理解,我僅僅是對於一級指針有所瞭解。指針的值和指針所指向的對象我還有點搞不清楚。

     這個程序是括號的檢驗,因爲之前寫過順序棧,這次想用鏈棧實現,使用尾插法,並讓指針域指向上一個節點姐可以形成棧,通過這個程序我認識到了在動手寫程序之前把邏輯搞清楚是很重要的,這個程序的邏輯就是,輸入括號-> 若爲左括號入棧,若爲右括號就與棧頂括號進行匹配->此時只有兩種情況,1.匹配,即刪去棧頂節點,並判斷是否爲空棧,若爲空棧就結束程序,輸出匹配。2.不匹配,輸出不匹配,結束程序。把邏輯理清楚後剩下的就是編程的事了,以後最好把邏輯用註釋寫在開頭。

     編程中我犯了大忌,在函數裏申請內存,一出函數就被釋放了,導致程序崩潰。還有往函數裏傳遞指針,函數形參的問題。代碼如下:

#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
typedef struct SqStack
{
    char c;
    struct SqStack *next;
}SqStack;

void InitStack(SqStack *s,SqStack **top)
{
    *top=s;
}

void GetTop(SqStack *s,char *e,SqStack *top)
{
    if(top->next==NULL)
    {
        printf("空棧\n");
        exit(0);
    }
    *e=top->next->c;
}
void Push(SqStack *&s,SqStack *&top,char c)//入棧,先對原來的top賦值,然後再申請新空間,top指向新空間
{
    SqStack *temp;
    temp=(SqStack *)malloc(sizeof(SqStack));
    top->c=c;
    temp->next=top;
    top=temp;
}
int match(char l, char r)//減檢驗,若爲左括號就入棧,右括號才進行檢驗,返回值爲-1,不匹配,爲0,正常入棧,爲1,消除棧頂。
{
    if(r=='('||r=='['||r=='{')
        return 0;
    if(r==')')
    {
        if(l!='(')
            return -1;
        else
            return 1;
    }
    if(r==']')
    {
        if(l!='[')
            return -1;
        else
            return 1;
    }
    if(r=='}')
    {
        if(l!='{')
            return -1;
        else
            return 1;
    }
}
void pop(SqStack *&s,SqStack *&top)
{
    top->next=top->next->next;
}
int Isempy(SqStack *&s,SqStack *&top)
{
    if(top->next==NULL)
    {
        return 1;
    }
    else
        return 0;
}
int main()
{
    SqStack *base;
    SqStack *top;
    SqStack *s;
    s=(SqStack *)malloc(sizeof(SqStack));
    s->next=NULL;
    InitStack(s,&top);
    char ch,zh;
    scanf("%c",&ch);
    Push(s,top,ch);
    while((ch=getchar())!='\n')//進行括號的輸入,若遇到右括號,與棧頂元素進行配對,配對成功即將棧頂元素出棧,否則輸出不配對,終止程序
    {
        scanf(" %c",&ch);
        GetTop(s,&zh,top);
        if(match(zh,ch)==-1)//如果爲右括號且不匹配
        {
            printf("%c     ------    %c",zh,ch);
            printf("不匹配\n");
            exit(0);
        }
        if(match(zh,ch)==0)//若爲左括號i,直接入棧
        {
            Push(s,top,ch);
        }
        if(match(zh,ch)==1)//若爲右括號且匹配,pop()
        {
            pop(s,top);
            if(Isempy(s,top)==1)
            {
                printf("匹配");
                exit(0);
            }
        }
    }

}

       這兩天睡眠相當不好,不知道爲什麼。還有和大二一起做的課程表app項目感覺自己被輕視了,其實被輕視也很正常,因爲我現在的確做不出什麼東西。但我相信總有一天,我會打臉的。也許就是我大二的時候。爲了做這個app我又要去學java和android,前段時間學的python又要荒廢了,我希望這次能夠有始有終,python上個暑假我就開始學了,直到現在連皮毛都沒學到。




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