链栈实现括号匹配算法

算法整体思想

封装好栈的基本操作:初始化,出栈,入栈,判断栈空。用字符数组存储用户输入的括号系列,遍历数组,如果是左括号就入栈,否则就弹出栈顶元素,将弹出的元素与该括号进行判断,若匹配则扫描下一个括号,如果匹配失败,算法结束,提示失败。扫描完所有字符后,如果栈非空,说明匹配失败。

编码实现

定义栈

typedef struct LNode{
    char data;
    struct LNode *next;
}*LiStack;

初始化

void InitLiStack(LiStack &L){
    L=(LNode *)malloc(sizeof(LNode));
    L=NULL;
}

出栈

bool Pop(LiStack &L,char &x){
    if(L==NULL)
        return false;
    x=L->data;
    LNode *p=L;
    L=L->next;
    free(p);
    return true;
}

入栈

bool Push(LiStack &L,char x){
    LNode *s=(LNode *)malloc(sizeof(LNode));
    if(s==NULL)
        return false;
    s->data=x;
    s->next=L;
    L=s;
    return true;
}

完整代码

#include 
#include "stdlib.h"
using namespace std;
#define InitSize 10
typedef struct LNode{
    char data;
    struct LNode *next;
}*LiStack;

void InitLiStack(LiStack &L){
    L=(LNode *)malloc(sizeof(LNode));
    L=NULL;
}

bool StackEmpty(LiStack L){
    if(L==NULL)
        return true;
    else
        return false;
}

bool Push(LiStack &L,char x){
    LNode *s=(LNode *)malloc(sizeof(LNode));
    if(s==NULL)
        return false;
    s->data=x;
    s->next=L;
    L=s;
    return true;
}#include <iostream>
#include "stdlib.h"
using namespace std;
#define InitSize 10
typedef struct LNode{
    char data;
    struct LNode *next;
}*LiStack;

void InitLiStack(LiStack &L){
    L=(LNode *)malloc(sizeof(LNode));
    L=NULL;
}

bool StackEmpty(LiStack L){
    if(L==NULL)
        return true;
    else
        return false;
}

bool Push(LiStack &L,char x){
    LNode *s=(LNode *)malloc(sizeof(LNode));
    if(s==NULL)
        return false;
    s->data=x;
    s->next=L;
    L=s;
    return true;
}


bool Pop(LiStack &L,char &x){
    if(L==NULL)
        return false;
    x=L->data;
    LNode *p=L;
    L=L->next;
    free(p);
    return true;
}


int main() {
    LiStack L;
    InitLiStack(L);
    char c[InitSize];
    int i=0,j=0;
    char x,temp;
    bool flag;
    cout<<"输入括号序列,以空格隔开,以‘#’结束"<<endl;
    cin>>x;
    while(x!='#'){
        c[i++]=x;
        cin>>x;
    }
    for (j; j < i; ++j) {
        if(c[j]=='(' || c[j]=='[')
            Push(L,c[j]);
        if(c[j]==')'){
            flag=Pop(L,temp);
            if(temp!='('){
                cout<<"栈顶元素为:"<<temp<<endl;
                cout<<"括号匹配失败"<<endl;
                return 0;
            }
        }
        if(c[j]==']'){
            flag=Pop(L,temp);
            if(temp!='['){
                cout<<"栈顶元素为:"<<temp<<endl;
                cout<<"括号匹配失败"<<endl;
                return 0;
            }
        }

    }
    if(StackEmpty(L) && flag)
        cout<<"匹配成功!"<<endl;
    else
        cout<<"匹配失败!"<<endl;
    return 0;
}

运行截图

链栈实现括号匹配算法_第1张图片

总结

如果左括号多于右括号,数组遍历完毕后,栈非空------失败
如果右括号多于左括号,数组遍历完毕后,最后一次必为出栈操作且出栈失败----失败

你可能感兴趣的:(算法,数据结构,算法,栈)