栈及栈的应用(有效的括号 力扣20)

栈的概念

栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

画个图理解一下

咱们可以观察到,进出数据只在栈顶进行

实现栈用数组最方便

栈的实现

cpp 复制代码
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
typedef int STDataType;

typedef struct Stack {
	STDataType* a;
	int top;
	int capacity;
}ST;

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

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

STDataType STTop(ST* pst);//获取栈顶元素
int STSize(ST* pst);//获取数据个数

bool STEmpty(ST* pst);//判空
cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"Stack.h"
void STInit(ST* pst)
{
	assert(pst);
	pst->a = NULL;
	pst->capacity = 0;
	pst->top = 0;
}

void STDestroy(ST* pst)
{
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->capacity = 0;
	pst->top = 0;
}

void STPush(ST* pst, STDataType x)
{
	assert(pst);
	if (pst->capacity == pst->top) {
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		STDataType* temp = (STDataType*)realloc(pst->a, newcapacity * sizeof(STDataType));//扩容扩的是数组,不是结构体
		if (temp == NULL) {
			perror("realloc fail");
			return;
		}
		pst->a = temp;
		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);
	return  pst->a[pst->top - 1];
}

int STSize(ST* pst)
{
	assert(pst);
	return pst->top - 1;
}

bool STEmpty(ST* pst)
{
	assert(pst);
	return pst->top == 0;
}

栈的应用

let's看题目

然后是代码实现

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
typedef char STDataType;

typedef struct Stack {
	STDataType* a;
	int top;
	int capacity;
}ST;


void STInit(ST* pst)
{
	assert(pst);
	pst->a = NULL;
	pst->capacity = 0;
	pst->top = 0;
}

void STDestroy(ST* pst)
{
	assert(pst);
	free(pst->a);
	pst->a = NULL;
	pst->capacity = 0;
	pst->top = 0;
}

void STPush(ST* pst, STDataType x)
{
	assert(pst);
	if (pst->capacity == pst->top) {
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		ST* temp = (ST*)realloc(pst->a, newcapacity * sizeof(STDataType));//扩容扩的是数组,不是结构体
		if (temp == NULL) {
			perror("realloc fail");
			return;
		}
		pst->a = temp;
		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);
	return  pst->a[pst->top - 1];
}

int STSize(ST* pst)
{
	assert(pst);
	return pst->top - 1;
}

bool STEmpty(ST* pst)
{
	assert(pst);
	return pst->top == 0;
}

bool isValid(char* s) {
    ST st;
    STInit(&st);
    while(*s){
        if(*s=='('||*s=='{'||*s=='['){
            STPush(&st,*s);
        }
        else{
            if(STEmpty(&st)){
                return false;
            }
            char top=STTop(&st);
            STPop(&st);
            if((top=='('&&*s!=')')||(top=='{'&&*s!='}')||(top=='['&&*s!=']')){
                STDestroy(&st);
                return false;
            }
        }
        ++s;
    }
    bool ret=STEmpty(&st);
    STDestroy(&st);
    return ret;
}
相关推荐
乐启国际旅行社有限公司13 分钟前
Java线程池实战:文旅系统批量任务性能优化(团期生成/数据导出)
java·开发语言·性能优化
会编程的土豆26 分钟前
LeetCode 热题 HOT100(一):哈希表与双指针入门(Go 实现)
算法·leetcode·职场和发展
学习中.........30 分钟前
并行 BPE 训练 与 手写 `Tokenizer`
人工智能·算法·机器学习·语言模型
宸津-代码粉碎机33 分钟前
告别手动Jar部署!生产级无损热部署方案,彻底解决OOM与更新失效问题
java·大数据·开发语言·人工智能·python
米码收割机35 分钟前
【移动】线上购物移动端网站(源码+文档)【独一无二】
java·开发语言·前端·python·django
小肝一下40 分钟前
多态(上)
android·开发语言·c++·vscode·多态·面向对象·伊蕾娜
科学实验家43 分钟前
动态规划2
算法·动态规划
東隅已逝,桑榆非晚1 小时前
数据结构常见英文术语速查手册
数据结构
imuliuliang10 小时前
关于数据结构在算法设计中的核心作用解析7
算法
魔力女仆11 小时前
分享一个 JS 鼠标跟随贪吃蛇背景库
开发语言·javascript·计算机外设