数据结构(C语言版)严蔚敏->顺序栈的定义利用顺序栈解决有效的括号

Posted 坚持不懈的大白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(C语言版)严蔚敏->顺序栈的定义利用顺序栈解决有效的括号相关的知识,希望对你有一定的参考价值。

头文件 SqStack.h

#ifndef SQSTACK_H_INCLUDED
#define SQSTACK_H_INCLUDED

// 顺序栈
#define Max_Stack_Size 50

typedef char ElemType;

typedef struct
    ElemType data[Max_Stack_Size]; //存放栈中的元素
    int top; // 栈顶指针
SqStack;

void InitSqStack(SqStack &S);
// 初始化一个空栈S
bool SqStackEmpty(SqStack S);
// 判断一个栈是否为空
bool Push(SqStack &S,ElemType e);
// 进栈
bool Pop(SqStack &S,ElemType &e);
// 出栈
bool GetTop(SqStack S,ElemType &e);
// 读栈顶元素

#endif // SQSTACK_H_INCLUDED

SqStack.cpp

#include "SqStack.h"
#include <stdlib.h>


void InitSqStack(SqStack &S)
    S.top = -1;

// 初始化一个空栈S
bool SqStackEmpty(SqStack S)
    return S.top == -1;

// 判断一个栈是否为空
bool Push(SqStack &S,ElemType e)
    // 栈满
    if(S.top+1 == Max_Stack_Size)
        return false;
    S.data[++S.top] = e;
    return true;

// 进栈
bool Pop(SqStack &S,ElemType &e)
    // 栈为空
    if(SqStackEmpty(S))
        return false;
    e = S.data[S.top--];
    return true;

// 出栈
bool GetTop(SqStack S,ElemType &e)
    if(SqStackEmpty(S))
        return false;
    e = S.data[S.top];
    return true;

// 读栈顶元素

1. 利用栈解决有效的括号问题

有效的括号题目来自leetcode,链接为:有效的括号,题目难度简单。
思路,首先判断当前栈是否为空,如果为空,则将当前字符入栈;如果栈不为空,则得到栈顶字符元素,将得到的栈顶字符元素与当前字符进行有效括号比较,不过不满足有效括号,则将当前栈入栈,否则将当前栈顶字符元素出栈,以此类推即可,最后判断栈是否为空,为空则字符串有效,否则无效。
参考代码如下:

#include <stdio.h>
#include <stdlib.h>
#include "SqStack.h"
#include <string.h>

bool ValidParentheses(ElemType *cs)
    SqStack s;
    InitSqStack(s);
    // 初始化一个栈
    int n = strlen(cs);
    int i = 0;
    ElemType c2,c3;
    while(i<n)
        c2 = cs[i++];

        if(SqStackEmpty(s))
            Push(s,c2);
            continue;
        
        // 如果栈为空,则将字符添加到栈中
        GetTop(s,c3);
        // 得到栈顶字符
        if((c3 =='(' and c2 == ')')||(c3=='[' and c2 == ']')||(c3=='' and c2 == ''))
            Pop(s,c3);
        else
            Push(s,c2);
    
    return SqStackEmpty(s);


int main()
    ElemType cs[50];
    printf("input:");
    scanf("%s",&cs);
    if(ValidParentheses(cs))
        printf("cs:%s is Valid parentheses\\n",cs);
    else
       printf("cs:%s is not Valid parentheses\\n",cs);
    
    return 0;

运行结果:

2. Java版本代码实现

class Solution 
    public boolean isValid(String s) 
        int n = s.length();
        if(n%2!=0)
            return false;
        
        
        Stack<String> stack = new Stack<>();
        Map<String,String> map = new HashMap<>();
        map.put("]","[");
        map.put(")","(");
        map.put("","");

        for(int i=0;i<n;i++)
            String s1 = s.substring(i, i + 1);

            if(stack.empty())
                stack.push(s1);
            else
                String s2 = stack.peek();
                if(map.containsKey(s1))
                    if(map.get(s1).equals(s2))
                        stack.pop();
                    else
                        stack.push(s1);
                    
                else
                    stack.push(s1);
                
            
        
        return stack.empty();
    


以上是关于数据结构(C语言版)严蔚敏->顺序栈的定义利用顺序栈解决有效的括号的主要内容,如果未能解决你的问题,请参考以下文章

数据结构(C语言版)严蔚敏->顺序表的定义及合并顺序表

数据结构(C语言版)严蔚敏->顺序表的定义及合并顺序表

数据结构(C语言版)严蔚敏->串的定义(顺序存储堆分配存储块链存储)

数据结构(C语言版)严蔚敏->队列的顺序存储(循环队列)和链式存储

谁有《数据结构》(C语言版)严蔚敏,清华大学2005年的课本?麻烦把目录告知,非常感谢

《数据结构:c语言版》(严蔚敏)知识点整合