栈判断字符串中的括号是否匹配c++

系列文章目录

前言

《数据结构基础》c语言版 第2版,Ellis Horowitz著,朱仲涛译
4.3节,page124,习题2

一、题目描述

使用栈判断字符串中的括号是否匹配

二、c++代码

1.顺序栈

代码如下:

#include<iostream>
using namespace std;

#define MaxSize 100
typedef char datatype;

typedef struct
{
    datatype data[MaxSize];
    int top;
}seq_stack;

void InitStack(seq_stack *&s)
{
    s=(seq_stack *)malloc(sizeof(seq_stack));
    s->top=-1;
}  //初始化栈

void DestoryStack(seq_stack *s)
{
    free(s);
}  //释放栈空间

bool StackEmpty(seq_stack *s)
{
    if(s->top == -1)
        return true;
    else
        return false;
}  //判断栈是否为空

void Push(seq_stack *&s,datatype e)
{
    if(s->top==MaxSize-1)   //栈满的情况,即栈上溢出
        printf("栈慢!\n");
    else
    {
        s->top++;
        s->data[s->top]=e;
    }
}  //入栈

datatype Pop(seq_stack *s)
{
    if(s->top == -1)
    {
        printf("栈空!\n");
        return '\0';
    } else
        return s->data[s->top--];
}  //出栈

datatype GetTop(seq_stack *s)
{
    if(s->top==-1)
    {
        printf("栈空!\n");
        return '\0';
    } else{
        return s->data[s->top];
    }
}  //获取栈顶元素

/*
 *  1.算法的核心思想为:遇到一个左括号将此左括号入栈,遇到一个右括号时,出栈一个左括号。
    2.当出现以下情况时,可判断此表达式括号不匹配:
       ①出栈的左括号与右括号类型不同,例 “{” 和“)”。
       ②遇到右括号时,栈中已没有左括号
       ③已到字符串结尾,栈中还有左括号。
 */
bool is_match(char const *c)
{
    datatype e;
    seq_stack *s;
    InitStack(s);
    int i=0;
    bool match = true;
    while (c[i]!='\0' && match)
    {
        if(c[i]=='(')
        {
            Push(s,c[i]);
        }
        else if(c[i]==')')
        {
            if(GetTop(s)=='(')
                Pop(s);
            else
                match = false;
        }
        else if(c[i]=='[')
        {
            Push(s,c[i]);
        }
        else if(c[i] == ']')
        {
            if(GetTop(s)=='[')
                Pop(s);
            else
                match = false;
        }
        else if(c[i] == '{')
        {
            Push(s,c[i]);
        }
        else if(c[i] == '}')
        {
            if(GetTop(s)=='{')
                Pop(s);
            else
                match = false;
        }
        ++i;
    }
    if(!StackEmpty(s))
        match = false;
    DestoryStack(s);
    return match;
}

int main()
{
    char const *s = "s{a(jfi)fjiasj[hfuah]}";
    if(is_match(s))
        printf("%s 该字符串中括号匹配!\n",s);
    else
        printf("%s 该字符串中括号不匹配!\n",s);
    return 0;
}

2.链栈

代码如下:

#include<iostream>
using namespace std;

#define MaxSize 100
typedef char datatype;

typedef struct link_stack
{
    datatype data;
    struct link_stack *link;
}link_stack;

void InitStack(link_stack *&s)
{
    s=(link_stack *)malloc(sizeof(link_stack));
    if(!s)
        exit(-1);
    s->link = NULL;
}  //初始化栈

void clear_stack(link_stack *s)
{
    link_stack *p = s->link;
    link_stack *r;
    s->link = NULL;
    if(p!=NULL)
    {
        r = p;
        p = p->link;
        free(r);
    }
}  //清空链栈

bool StackEmpty(link_stack *s)
{
    if(s->link == NULL)
        return true;
    else
        return false;
}  //判断栈是否为空

int stack_len(link_stack *s)
{
    int len = 0;
    link_stack *temp = s->link;
    while (temp!=NULL)
    {
        len ++;
        temp = temp->link;
    }
    return len;
} //获取链栈的长度

datatype GetTop(link_stack *s)
{
    link_stack *temp = s;
    if(temp->link == NULL)
        return '\0';
    return temp->link->data;
}  //获取栈顶元素

void Push(link_stack *s,datatype e)
{
    link_stack *temp = new link_stack;
    temp->data = e;
    temp->link = s->link;
    s->link = temp;
}  //入栈

datatype Pop(link_stack *s)
{
    if(s->link == NULL)
        return '\0';
    datatype e = s->link->data;
    link_stack *temp = s->link;
    s->link = temp->link;
    free(temp);
    return e;
}  //出栈

/*
 *  1.算法的核心思想为:遇到一个左括号将此左括号入栈,遇到一个右括号时,出栈一个左括号。
    2.当出现以下情况时,可判断此表达式括号不匹配:
       ①出栈的左括号与右括号类型不同,例 “{” 和“)”。
       ②遇到右括号时,栈中已没有左括号
       ③已到字符串结尾,栈中还有左括号。
 */
bool is_match(char const *c)
{
    datatype e;
    link_stack *s;
    InitStack(s);
    int i=0;
    bool match = true;
    while (c[i]!='\0' && match)
    {
        if(c[i]=='(')
        {
            Push(s,c[i]);
        }
        else if(c[i]==')')
        {
            if(GetTop(s)=='(')
                Pop(s);
            else
                match = false;
        }
        else if(c[i]=='[')
        {
            Push(s,c[i]);
        }
        else if(c[i] == ']')
        {
            if(GetTop(s)=='[')
                Pop(s);
            else
                match = false;
        }
        else if(c[i] == '{')
        {
            Push(s,c[i]);
        }
        else if(c[i] == '}')
        {
            if(GetTop(s)=='{')
                Pop(s);
            else
                match = false;
        }
        ++i;
    }
    if(!StackEmpty(s))
        match = false;
    clear_stack(s);
    return match;
}

int main()
{
    char const *s = "s{a(jfi)fjiasj[hfuah]}";
    if(is_match(s))
        printf("%s 该字符串中括号匹配!\n",s);
    else
        printf("%s 该字符串中括号不匹配!\n",s);
    return 0;
}

总结

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页