php 棧操作匹配括號( )

今天面試的時候被面試官問到棧操作,當時回答的不是很好,回來後查資料自己總結了一下。

括號匹配是棧的一個重要的應用。具體做法:對輸入的字符串進行篩選,找出其中的括號入棧。對於匹配的括號,不管有多複雜,總是先對緊鄰的兩個括號進行匹配的, 

如:({ } { [ ( ) ]。 

首先第一個‘(’入棧,當下一個括號不是右括號(即“)]}”),繼續‘{’入棧,當遇到‘}’時,彈出棧頂的 ‘{‘與此時的‘}’進行比較,匹配則繼續,不匹配則停止,給出不匹配的括號,如此下去直到全部處理完所有的括號,檢查棧是否爲空,判斷最終是否匹配成功。

#include "stdafx.h"
#include <iostream>
using namespace std;


#define STACK_INIT_SIZE     100
#define STACKINCREMENT      10
#define OK                      1
#define ERROR                   0
#define CONVERSION_NUM          8


typedef int     SElemType;
typedef int     Status;




typedef struct{
    SElemType *base;
    SElemType *top;
    int stackSize;
}stack;


stack s; //全局變量,棧


Status InitStack(stack &s){
    s.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if (!s.base){ cout << "內存不足!" << endl; return ERROR; }
    s.top = s.base;
    s.stackSize = STACK_INIT_SIZE;
    return OK;
}
bool StackEmpty(stack s){
    if (s.base == s.top) return true;
    else return false;
}
Status Push(stack &s, SElemType e){
    if (s.top - s.base >= s.stackSize){
        s.base = (SElemType*)realloc(s.base, (s.stackSize + STACKINCREMENT) * sizeof(SElemType));
        if (!s.base){ cout << "內存不足!" << endl; return ERROR; }
        s.stackSize = s.stackSize + STACKINCREMENT;
    }
    *s.top = e;
    s.top++;
    return OK;
}
Status Pop(stack &s, SElemType &e){
    if (s.base == s.top){ cout << "棧爲空!" << endl; return ERROR; }
    s.top--;
    e = *s.top;
    return OK;
}
int _tmain(int argc, _TCHAR* argv[])
{
    InitStack(s);
    char *p;
    int e;
    p = (char *)malloc(sizeof(char)* 100);
    cout << "輸入包含括號的表達式:"<<endl;
    while (gets(p)){


        /*處理過程  篩選出字符串中的括號  是左括號就入棧 遇到右括號就出棧,並將棧頂元素賦值給變量e,這時比較e與此時的右括號,
        若同爲()  或  [] 或  {}  則匹配成功  否則 匹配失敗
        */
        while (*p){
            switch (*p)
            {
            case '(':Push(s, *p++); break;   //左括號則入棧,p指針往後移動
            case '[':Push(s, *p++); break;
            case '{':Push(s, *p++); break;
            case ')':
                Pop(s, e);
                if (e == '(') p++;
                else { cout << "')'匹配失敗" << endl; exit(OVERFLOW); }
                break;
            case ']':
                Pop(s, e);
                if (e == '[') p++;
                else { cout << "']'匹配失敗" << endl; exit(OVERFLOW); }
                break;
            case '}':
                Pop(s, e);
                if (e == '{') p++;
                else { cout << "'{'匹配失敗" << endl; exit(OVERFLOW); }
                break;
            default:p++;
                break;
            }


        }
        if (StackEmpty(s))cout << "匹配成功!" << endl;
        else cout << "匹配失敗,缺少右括號!" << endl;
        cout << "輸入包含括號的表達式:" << endl;
    }
    system("pause");
    return 0;
}

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