括號匹配

⭐ 我的網站: www.mengyingjie.com ⭐
編寫程序檢查該字符串的括號是否成對出現,而且不能交叉出現。
輸入:
一個字符串,裏邊可能包含“()”、"{}"、“[]”三種括號,“#”結束
輸出:
成功:代表括號成對出現並且嵌套正確
失敗:未正確使用括號字符。

分析

用一個棧,就能解決該問題,左括號棧頂字符必須和第一個入棧的右括號字符匹配。
棧介紹:棧是一種特殊的線性表,僅能在線性表的一端操作。
棧的特性:後進先出(LIFO)
由於正在學數據結構,於是棧的定義與操作都是自己編寫的,爲了鞏固概念

#include<stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define STACK_INT_SIZE 100
#define STACKINCREMENT 10
#define bool int
#define true 1
#define false 0
#define TRUE 1
#define FALSE 0
#define SElemType char

typedef struct
{
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;

//------基本操作的函數原型說明------

bool InitStack(SqStack *S);
    //構建一個空棧
bool DestroryStack(SqStack *S);
    //銷燬棧S S 不再存在
bool ClearStack(SqStack *S);
    //讓S 變成一個空棧
bool StackEmpty(SqStack *S);
    //判斷S是否爲空棧 ,爲空棧返回true 否則返回false
int StackLength(SqStack S);
    //返回S的元素個數,及爲S的長度
bool GetTop(SqStack S);
    //若棧不爲空,返回棧頂元素,並返回true 否則返回 false
bool Push(SqStack *S,SElemType e);
    //插入元素 違心的棧頂元素
bool Pop(SqStack *S,SElemType *e);
    //若棧不爲空,則刪除棧頂元素,用e返回其值,返回true, 否則返回false
bool StackTraverse(SqStack S,bool(*vist)());
    //從棧底到棧頂依次對每一個元素visit(),一旦visit失敗,則操作失敗

//------基本操作的算法描述------
InitStack(SqStack *S)
{
    S->base = (SElemType *)malloc(STACK_INT_SIZE*sizeof(SElemType));
    if(!S->base) return 0;
    S->top = S->base;
    S->stacksize = STACK_INT_SIZE;
    return 1;
}

GetTop(SqStack S)
{
    if(S.top==S.base) return 0;

    return *(S.top-1);
}

Push(SqStack *S,SElemType e)
{
    if(S->top - S->base>=S->stacksize) //如果棧滿  需要增加空間
    {
        S->base = (SElemType*)realloc(S->base, (S->stacksize + STACKINCREMENT)*sizeof(SElemType));
        if(!S->base) return 0;
        S->top = S->base + S->stacksize;
        S->stacksize +=STACKINCREMENT;
    }
    *(S->top++)=e;
    return 1;
}

Pop(SqStack *S,SElemType *e)
{
    if(S->top==S->base) return 0;
    *e = *(--S->top);
    return 1;
}

int CheckChar(char c, char OP[])
{
    int i;
    for(i=0; i<3; i++)
        if(c==OP[i])return i;
    return 999;
}

int main()
{
    SqStack OPTR;
    InitStack(&OPTR);
    Push(&OPTR,'#');
    printf("輸入括號以“#”結尾\n");
    char c;
    c=getchar();
    int m=1;          //判斷最終是否完全匹配   完全匹配  值爲1,否則爲0
    char OP1[] = {'[','(','{'};
    char OP2[] = {']',')','}'};
    while(c!='#')
    {
        if(CheckChar(c,OP1)<3)
        {
            Push(&OPTR,c);
            c=getchar();
        }
        else
        {
            if(CheckChar(GetTop(OPTR),OP1)==CheckChar(c,OP2))
            {
                //printf(" -+ ");
                Pop(&OPTR,&c);
                c=getchar();
                continue;
            }
            else
            {
                m=0;
                break;
            }
        }

    }
    if(GetTop(OPTR)!=c)m=0;
    if(m==1)printf("\n括號完全匹配!");
    else printf("\n括號匹配失敗!");
    return 0;
}
遇到此類問題,但看了文章還是未解決,
評論或加 QQ:781378815
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章