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;
}

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