C语言/数据结构——每日一题(有效的括号)

一.前言

如果想要使用C语言来解决这道题------有效的括号:https://leetcode.cn/problems/valid-parentheses/description/我们必须要借用上一篇我们所讲的内容------栈的实现:https://blog.csdn.net/yiqingaa/article/details/138923750?spm=1001.2014.3001.5502

因为在C语言环境下,力扣不会主动帮你实现栈,需要用户自己手动创建栈。但是在C++环境下,力扣会主动为我们实现栈。

2.正文

1.1题目描述

1.2题目分析

1.21 题目想让用户干什么

这道题为我们用户提供了一个字符串s。我们需要编写程序来判断所给字符串s中,相同类型的左括号与右括号是否一 一匹配。如果匹配正确就返回true。匹配不正确就返回false。

1.22 如何求解题目

这道题我们可以运用栈的知识面来求出这道题。

我们可以先创建一个栈变量st,然后让字符串s逐一遍历字符,如果遍历过程中字符是'(' '[' '{' 都可以将它们尾插到我们栈当中。如果在遍历过程中不是'(' '[' '{' ,而是')' ']' '}'我们可以调用之前写好的函数功能------取出栈顶元素( STDataType STTop(ST* ps) 这里的SLDataType是我们栈数据类型,可能是int、char或者其他类型。),调出可能之前存入栈的字符'(' '[' '{' ,并与遍历字符作对比。这里我暂且将取出栈顶的元素用变量top接受。我们就有取出栈顶元素,与现在遍历字符的关系:

if ((top == '(' && *s != ')') ||

(top == '{' && *s != '}') ||

(top == '[' && *s != ']'))

满足上面其中一个条件我们就可以说明,相同类型的左括号与右括号没有一 一匹配。我们直接返回false即可。

值得注意的是:在返回true,或者false之前,都要对栈进行销毁处理------void STDestroy(ST* ps)

1.3代码实现

cpp 复制代码
typedef int STDataType;
struct Stack
{
	STDataType* a;
	int top;
	int capacity;
};
typedef struct Stack ST;
void STInit(ST* ps);//栈的初始化
void STDestroy(ST* ps);//栈的销毁

void STPush(ST*PS,STDataType x);//入栈
void STPop(ST* ps);//出栈

STDataType STTop(ST* ps);//取栈顶的数据

bool STEmpty(ST*ps);//判空

int STSize(ST* PS);//获取数据个数
void STInit(ST *ps)//栈的初始化
{
	assert(ps);
	ps->a = NULL;
	ps->capacity = ps->top = 0;
}
void STDestroy(ST* ps)//栈的销毁
{
	assert(ps);
		free(ps->a);
		ps->a = NULL;
		ps->top = ps->capacity = 0;
}
void STPush(ST* ps, STDataType x)//入栈
{
	assert(ps);
	if (ps->capacity == ps->top)
	{
		int newcapacity = ps->capacity == 0 ? 10 : ps->capacity*2;
		STDataType* tmp = (STDataType*)realloc(ps->a, newcapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail!");
			return;
		}                
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
	ps->a[ps->top] = x;
	ps->top++;
}
void STPop(ST* ps)//删除栈顶元素
{
	assert(ps);
	assert(ps->a);
	ps->top--;
}
STDataType STTop(ST* ps)//取出栈顶元素
{
	assert(ps);
	assert(ps->top >= 0);
	return ps->a[ps->top-1];
}
bool STEmpty(ST* ps)//判断栈内元素是否为空
{
	assert(ps);
	if (ps->top == 0)
		return true;
	return false;
}
int STSize(ST* ps)//获取数据个数
{
	assert(ps);
	return ps->top ;
}
bool isValid(char* s) 
{
   ST st;
STInit(&st);
while (*s)
{
	if (*s == '(' || *s == '{' || *s == '[')
	{
		STPush(&st, *s);
	}
	else
	{
        if(STEmpty(&st))//这一步是必须的,因为如果栈为空且*s是')' ']' '}',说明
//题目给出的字符可能是这样的")"、"(){}]"。类似这种情况都是不符合题意的情况。
        return false;
		char top = STTop(&st);
		STPop(&st);//这里一定要进行尾部栈顶元素删除,以便遍历字符和栈内字符能够对的上
		if ((top == '(' && *s != ')') ||
			(top == '{' && *s != '}') ||
			(top == '[' && *s != ']'))
		{
			return false;
		}
	}
	++s;
}
if (st.top != 0)
	return false;
STDestroy(&st);
return true;
}

三.结言

今天的题目分享就到此结束了,觉得对你有所帮助的同学,能不能求一个三连。

相关推荐
A懿轩A34 分钟前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
半盏茶香39 分钟前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
️南城丶北离2 小时前
[数据结构]图——C++描述
数据结构··最小生成树·最短路径·aov网络·aoe网络
✿ ༺ ོIT技术༻2 小时前
C++11:新特性&右值引用&移动语义
linux·数据结构·c++
字节高级特工2 小时前
【C++】深入剖析默认成员函数3:拷贝构造函数
c语言·c++
计算机学长大白3 小时前
C中设计不允许继承的类的实现方法是什么?
c语言·开发语言
XH华8 小时前
初识C语言之二维数组(下)
c语言·算法
菜鸡中的奋斗鸡→挣扎鸡9 小时前
滑动窗口 + 算法复习
数据结构·算法
axxy200010 小时前
leetcode之hot100---240搜索二维矩阵II(C++)
数据结构·算法
Uu_05kkq11 小时前
【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
c语言·数据结构·算法