数据结构(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语言版)严蔚敏->队列的顺序存储(循环队列)和链式存储