用栈实现括号匹配问题

栈结构具有后进先出的特点。括号匹配问题描述:若表达式中包含三种括号:圆括号、方括号和花括号,它们可以相互嵌套。

算法思想:检验算法中可设置一个栈,每读入一个括号,若是左括号,则直接进栈,等待相匹配的同类右括号;若读入的是右括号,且与当前栈顶左括号同类型,则二者匹配,将栈顶的左括号弹出,否则属于不合法情况。另外。如果输入序列已经读完,而栈中仍有等待匹配的左括号,或者读入一个右括号,而栈中已无等待匹配的同类型左括号,均属于不合法情况。当输入序列和栈同时变空的时候,说明所有括号完全匹配。

程序:括号匹配算法

#include<stdio.h>
#include<iostream>
#define FALSE 0
#define TRUE 1

using namespace std;
//链栈实现,采用链表作为存储结构来实现栈
typedef struct node{
    char data;
    struct node *next;
}linkStackNode;

typedef linkStackNode *linkstack;


int push(linkStack top,char x);

int* pop(linkStack top);

void bracketMatch(char *str);

bool match(char l,char r);

int main(){
    char a[30];
    cin.get(a,30); //有些类似getline。可以输入多个单词,中间空格隔开。
    bracketMatch(a);
}

int push(linkStack top,char x){ //将元素x压入到栈top中
    linkStackNode *temp;
    temp=(linkStackNode *)malloc(sizeof(linkStackNode));
    if(temp==NULL)   return(FALSE);//申请空间失败
    temp->data=x;
    temp->next=top->next;
    top->next=temp;  //修改当前栈顶指针
    return(TRUE);  //头插法    

}
char* pop(linkStack top){//将栈top元素的栈顶元素弹出,返回弹出元素的存储空间
    linkStackNode *temp;
    char *x;
    temp=top->next;
    if(temp==NULL)   return(FALSE);
    top->next=temp->next;
    *x=temp->data;
    free(temp);
    return(*x);
}
bool match(char l,char r){
    bool judgematch=FALSE;
    if((l='('&&r=')')||(l='['&&r=']')||(l='{'&&r='}'))
        judgematch=TRUE;
    return judgematch;
}

void bracketMatch(char *str){//str[]中为输入的字符串,利用堆栈技术检查该字符串中的括号是否匹配
    linkStack s;
    int i;
    char ch;
    for(i=0;str[i]!='\0';i++){
        switch(str[i]){
            case '(':
            case '[':
            case '{':  //若为左括号则进栈
                push(&s,str[i]);
                break;
            case ')':
            case ']':
            case '}':    //左括号时候
                if(s->next==NULL){  //如果栈空
                    cout<<"右括号多余"<<endl;    return;}
                else{
                    &ch=s->next->data;
                    if(match(ch,str[i]))
                        pop(&s,&ch);    //已匹配的左括号出栈
                    else{
                        cout<<"对应的左右括号不同类"<<endl; return;}
                }
        }
        if(s->next=NULL)
            cout<<"括号匹配"<<endl;
        else
            cout<<"左括号多余"<<endl;

    }

}

在此还可以通过C++标准库(STL)中,实现了栈和队列,方便使用,并提供了若干方法。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值