【每日OJ—有效的括号(栈)】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录
前言

1、有效的括号题目:

1.1方法讲解:

1.2代码实现:

总结


前言

世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你们有所帮助,同时也希望各位看官能对我的文章给与点评,希望我们能够携手共同促进进步,在编程的道路上越走越远!


提示:以下是本篇文章正文内容,下面案例可供参考

1、有效的括号题目:

1.1方法讲解:

解题思路:

栈的规则:后入先出。我们这道题用栈来解答。

步骤:1、遍历字符串;

2、让字符串中的左括号'(','[', '{'入栈;

3、如果遇到右括号')' ']' '}'就出栈,让栈顶出来的左括号与右括号进行匹配。
在对左、右括号匹配时,可能会出现以下几种情况:

1、右括号比左括号多,数量匹配问题,返回false;

2、左括号比右括号多,数量匹配问题,返回false;

3、全是左括号或者全是右括号,数量匹配问题,返回false。

1.2代码实现:

cs 复制代码
typedef int STDataType;
typedef struct stack
{
	STDataType* a;
	int top;//标识栈顶的位置
	int capacity;
}ST;

//初始化
void STInit(ST* pst);
//销毁
void STDestory(ST* pst);

//压栈
void STPush(ST* pst, STDataType x);
//出栈
void STPop(ST* pst);

//获取栈顶元素
STDataType STTop(ST* pst);

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

//统计栈内元素个数
int STSize(ST* pst);

//初始化
void STInit(ST* pst)
{
	assert(pst);
	pst->a = NULL;
	//表示top指向栈顶元素的下一个位置
	pst->top = 0;

	//表示top指向栈顶元素
	//pst->top = -1;

	pst->capacity = 0;
}
//销毁
void STDestory(ST* pst)
{
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->capacity = pst->top = 0;
}

//压栈
void STPush(ST* pst, STDataType x)
{
	assert(pst);
	//判断数组栈空间是否足够
	if (pst->top == pst->capacity)
	{
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		pst->a = tmp;
		pst->capacity = newcapacity;
	}
	pst->a[pst->top] = x;
	pst->top++;
}
//出栈
void STPop(ST* pst)
{
	assert(pst);
	assert(pst->top > 0);
	pst->top--;
}

//获取栈顶元素
STDataType STTop(ST* pst)
{
	assert(pst);
	assert(pst->top > 0);
	return pst->a[pst->top - 1];
}

//判空
bool STEmpty(ST* pst)
{
	assert(pst);
	//判断数组栈为空
	//1、如果top是指向栈顶元素的下一个位置,那当top == 0时,栈为空
	//2、如果top时指向栈顶元素,那当top == -1时,栈为空
	/*if (pst->top == 0)
	{
		return true;
	}
	else
	{
		return false;
	}*/
	return pst->top == 0;
}

//统计栈内元素个数
int STSize(ST* pst)
{
	assert(pst);
	//1、如果top指向栈顶元素的话,栈内元素的个数为top+1;
	//2、如果top指向栈顶元素的下一个位置的话,栈内元素的个数为top;
	return pst->top;
}

bool isValid(char* s) {
    //同一个域里面不能有同一个变量
    ST st;
    STInit(&st);
    while(*s)
    {
        //遍历字符串
        //如果是左括号就入栈
        if(*s == '[' || *s == '(' || *s == '{')
        {
            STPush(&st,*s);
            s++;
        }
        else
        {
            //右括号多,左括号少的数量匹配问题
            if(STEmpty(&st))
            {
                STDestory(&st);
                return false;
            }
            //如果是右括号,就从栈中取出一个左括号来进行匹配
            char top = STTop(&st);
            STPop(&st);

            //顺序不匹配
            if((*s == '}' && top != '{') 
            || (*s == ']' && top != '[')
            || (*s == ')' && top != '('))
            {
                STDestory(&st);
                return false;
            }
            s++;
        }
    }
    //栈为空,返回真,说明数量匹配
    //匹配问题:左括号多,右括号少
    bool ret = STEmpty(&st);
    STDestory(&st);
    return ret;
}

总结

好了,本篇博客到这里就结束了,如果有更好的观点,请及时留言,我会认真观看并学习。
不积硅步,无以至千里;不积小流,无以成江海。

相关推荐
JeffersonZU2 小时前
Linux/Unix 套接字Socket编程(socket基本概念,流程,流式/数据报socket,Unix domain socket示例)
linux·c语言·tcp/ip·udp·unix·gnu
小小小新人121233 小时前
C语言 ATM (4)
c语言·开发语言·算法
无限远的弧光灯5 小时前
c语言学习_函数递归
c语言·开发语言·学习
小林C语言5 小时前
C语言 | 指针小结
c语言
黎明smaly7 小时前
【排序】插入排序
c语言·开发语言·数据结构·c++·算法·排序算法
LIN-JUN-WEI9 小时前
[ESP32]VSCODE+ESP-IDF环境搭建及blink例程尝试(win10 win11均配置成功)
c语言·开发语言·ide·vscode·单片机·学习·编辑器
艾莉丝努力练剑10 小时前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(三)
c语言·开发语言·数据结构·学习·算法
黑听人11 小时前
【力扣 困难 C】115. 不同的子序列
c语言·leetcode
看到我,请让我去学习17 小时前
OpenCV编程- (图像基础处理:噪声、滤波、直方图与边缘检测)
c语言·c++·人工智能·opencv·计算机视觉
倔强的小石头_19 小时前
【C语言指南】函数指针深度解析
java·c语言·算法