栈的实现.
创始人
2024-04-11 00:18:13
0

文章目录

  • 1.栈的概念及结构
  • 2.栈的实现(数组实现)
    • 2.1栈头文件
    • 2.2函数实现
  • 3.栈的习题
    • 3.1有效的括号
      • 3.1.1思路分析
      • 3.1.2代码实现


1.栈的概念及结构

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

2.栈的实现(数组实现)

2.1栈头文件

#pragma once
#include
#include
#include
#include
#include
typedef int STDatatype;
typedef struct stack
{STDatatype* a;int top;int capacity;
}ST;
void StackInit(ST* ps);
void StackDestroy(ST* ps);
void StackPush(ST* ps, STDatatype x);
void StackPop(ST* ps);
STDatatype StackTop(ST* ps);
bool StackEmpty(ST* ps);
int StackSize(ST* ps);

2.2函数实现


#include"stack.h"
void StackInit(ST* ps)
{assert(ps);ps->a = (STDatatype*)malloc(sizeof(STDatatype) * 4);if (ps->a == NULL){perror("malloc fail");exit(-1);}ps->top = 0;//top的值是值得推敲的,如果为0那么top指向的就是栈顶元素的下一个,并且top的值还是元素数量,如果top的值为-1,那么top的指向的就收栈顶元素ps->capacity = 4;}
void StackDestroy(ST* ps)
{assert(ps);free(ps->a);ps->top = 0;ps->capacity = 0;
}
void StackPush(ST* ps, STDatatype x)
{assert(ps);if (ps->top == ps->capacity){STDatatype* tmp = (STDatatype*)realloc(ps->a, ps->capacity * 2 * sizeof(STDatatype));if (tmp == NULL){perror("malloc");exit(-1);}ps->capacity *= 2;ps->a = tmp;}ps->a[ps->top] = x;ps->top++;}
void StackPop(ST* ps)
{assert(ps);/*assert(ps->top > 0);*/assert(!StackEmpty(ps));ps->top--;}
STDatatype StackTop(ST* ps)
{assert(ps);//assert(ps->top > 0);assert(!StackEmpty(ps));return ps->a[ps->top-1];
}
bool StackEmpty(ST* ps)
{assert(ps);return(ps->top == 0);
}
int StackSize(ST* ps)
{assert(ps);return ps->top;
}

3.栈的习题

3.1有效的括号

在这里插入图片描述

3.1.1思路分析

首先拿到这道题我们可能会进入一个误区
我们可能会想到strlen来求字符长度奇偶性来判断是否合法,这显然想得不够全面"{{{{{{"显然这种就不好用。
这道题简单来看合不合法就是依次消掉括号,看最后能否都消除
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.1.2代码实现


typedef char STDatatype;
typedef struct stack
{STDatatype* a;int top;int capacity;
}ST;
void StackInit(ST* ps)
{assert(ps);ps->a = (STDatatype*)malloc(sizeof(STDatatype) * 4);if (ps->a == NULL){perror("malloc fail");exit(-1);}ps->top = 0;ps->capacity = 4;}
void StackDestroy(ST* ps)
{assert(ps);free(ps->a);ps->top = 0;ps->capacity = 0;
}
void StackPush(ST* ps, STDatatype x)
{assert(ps);if (ps->top == ps->capacity){STDatatype* tmp = (STDatatype*)realloc(ps->a, ps->capacity * 2 * sizeof(STDatatype));if (tmp == NULL){perror("malloc");exit(-1);}ps->capacity *= 2;ps->a = tmp;}ps->a[ps->top] = x;ps->top++;}
bool StackEmpty(ST* ps)
{assert(ps);return(ps->top == 0);
}
void StackPop(ST* ps)
{assert(ps);/*assert(ps->top > 0);*/assert(!StackEmpty(ps));ps->top--;}
STDatatype StackTop(ST* ps)
{assert(ps);//assert(ps->top > 0);assert(!StackEmpty(ps));return ps->a[ps->top-1];
}int StackSize(ST* ps)
{assert(ps);return ps->top;
}
bool isValid(char * s){ST st;StackInit(&st);while(*s){if(*s=='{'||*s=='['||*s=='('){StackPush(&st,*s);++s;}else{if(StackEmpty(&st)){return false;}char top=StackTop(&st);StackPop(&st);if((*s=='}'&&top!='{')||(*s==']'&&top!='[')||(*s==')'&&top!='(')){return false;}else{++s;}}}bool ret=StackEmpty(&st);StackDestroy(&st);return ret;}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...