【C++】栈~~(很详细哦)

这篇具有很好参考价值的文章主要介绍了【C++】栈~~(很详细哦)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在前几天,我们刚一起学过顺序表,链表(无头单向不循环,有头双向循环),这两种都属于线性表因为是一系列存储的。而以后的哈希表则是散列表

今天我们看一下栈【C++】栈~~(很详细哦)

目录

1.栈的介绍

2.实现

3.题目 


1.栈的介绍

栈,又叫做栈帧,也是一种数据结构(和顺序表链表一样),但是他自己的结构也有一些特殊的地方

【C++】栈~~(很详细哦)

 他是这样的,我们把底部叫做栈底,顶部叫做栈顶,通俗易懂对吧,但是他有一个小规则,只能从栈顶存储或者销毁数据,如果现在有一个空栈,那么存储删除数据就是下面这样的 

【C++】栈~~(很详细哦)

 永远不可能从栈底拿出数据,没有为什么~~

或者你也可以总结成LIFO原则(last in first out)即后进先出

2.实现

不难发现,其实他的结构和之前学过的顺序表 链表很相似,我们已经写过两个了,这个可不可以仿照着写呢?那模仿哪一个更好?

分析一下啦

首先他不存在不连续存储的问题,在这点上其实二者(顺序表,链表)都行,但是既然都连续存储了还是顺序表更方便一下,不需要指针指来指去

其次最好可以很方便的访问数据,而且能快速进行一个位置(栈顶或者栈底)的增删,因为栈的结构就决定他只需要一个位置增删就可以,那就是顺序表的下标访问最合适不过了~~~

所以我们采取顺序表的写法来写栈

对于顺序表不了解的同学赶紧去看看我的顺序表那篇文章在下面

顺序表在这里

 头文件

#pragma once
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
#include <assert.h>
typedef int type;
typedef struct Stack
{
	type *a;
	int top;// 初始化成0 表示栈顶位置下一个位置的下标
	int capacity;
}ST;

void InitST(ST* p);//初始化
void PushST(ST* p,type x);//在栈顶压数据
void PopST(ST* p);//从栈顶删除数据
void DestoryST(ST* p);//销毁栈
bool Empty(ST* p);//判断栈是不是空
type StackTop(ST* p);//显示栈顶的数据
type SizeST(ST* p);//栈里面数据的个数

实现

#include "stack.h"

void InitST(ST* p)//初始化
{
	type* tmp = (type*)malloc(sizeof(type)*4);
	if (tmp == NULL)
	{
		perror("InitST");
		exit(-1);
	}
	p->a = tmp;
	p->capacity = 4;
	p->top = 0;
}

void PushST(ST* p, type x)//在栈顶压数据
{
	if (p->capacity == p->top)//表示需要扩容
	{
		ST* tmp = (ST*)realloc(p->a, p->capacity* 2*sizeof(type));
		if (tmp == NULL)
		{
			perror("realloc");
			exit(-1);
		}
		p->a = tmp;
		p->capacity *= 2;
	}
	p->a[p->top] = x;
	p->top++;
}

void PopST(ST* p)//从栈顶删除数据
{
	assert(p);
	assert(!Empty(p));
	p->top--;
}

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

bool Empty(ST* p)//判断栈是不是空
{
	assert(p);
	return p->top == 0;
}

type StackTop(ST* p)//显示栈顶的数据
{
	assert(p);
	assert(!Empty(p));
	return p->a[p->top - 1];
}

type SizeST(ST* p)//栈里面数据的个数
{
	assert(p);
	return p->top;
}

3.题目

有效括号(典中典)

题目在这里大家先自己做一下

我们用C语言写一下,其实就是匹配的问题,如果都是左括号比如(,{,【,这些都是要压栈的,不需要遍历到结束再去判断是否匹配的问题,只要遇到右括号就及时匹配就好了

因为是C语言写的所以需要在前面把我们写的栈带上

typedef int type;

typedef struct Stack
{
	type *a;
	int top;// 初始化成0 表示栈顶位置下一个位置的下标
	int capacity;
}ST;
bool Empty(ST* p)//判断栈是不是空
{
	assert(p);
	return p->top == 0;
}
void InitST(ST* p)
{
	type* tmp = (type*)malloc(sizeof(type)*4);
	if (tmp == NULL)
	{
		perror("InitST");
		exit(-1);
	}
	p->a = tmp;
	p->capacity = 4;
	p->top = 0;
}

void PushST(ST* p, type x)//在栈顶压数据
{
	if (p->capacity == p->top)//表示需要扩容
	{
		type* tmp = (type*)realloc(p->a, p->capacity* 2*sizeof(type));
		if (tmp == NULL)
		{
			perror("realloc");
			exit(-1);
		}
		p->a = tmp;
		p->capacity *= 2;
	}
	p->a[p->top] = x;
	p->top++;
}

void PopST(ST* p)//从栈顶删除数据
{
	assert(p);
	assert(!Empty(p));
	p->top--;
}

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

type StackTop(ST* p)//显示栈顶的数据
{
	assert(p);
	assert(!Empty(p));
	return p->a[p->top - 1];
}

bool isValid(char * s){
ST st;
InitST(&st);
while(*s)
{
    if(*s=='(' || *s=='[' || *s=='{')
    {
        PushST(&st,*s);
        ++s;
    }
    else
    {
        if(Empty(&st))
        {
            DestoryST(&st);
             return false;

        }
        char top=StackTop(&st);
          PopST(&st);
          if((*s==')'&& top!='(' )||(*s==']'&& top!='[' )||( *s=='}'&&top!='{'))
          {
            DestoryST(&st);
             return false;
          }
             else{
                 s++;
             }
          
    }
   
}
 bool ret=Empty(&st);
            DestoryST(&st);
     return ret;
}

大家学会了吗~~~ 文章来源地址https://www.toymoban.com/news/detail-443533.html

到了这里,关于【C++】栈~~(很详细哦)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++练级之路】【Lv.3】类和对象(中)(没掌握类的6个默认成员函数,那你根本就没学过C++!)

    欢迎各位小伙伴关注我的专栏,和我一起系统学习C++,共同探讨和进步哦! 学习专栏 : 《进击的C++》 在C++的学习中,类和对象章节的学习尤为重要,犹如坚固的地基,基础不牢,地动山摇;而默认成员函数的学习,在类和对象的学习里最为重要。所以要 学好C++,学好默认

    2024年02月04日
    浏览(49)
  • C语言第四课--------要我们一起快乐的学习吧

    有兴趣的小可爱可以来参观我的giteehttps://gitee.com/qin-laoda typedef static #define 定义常量和宏 指针 结构体 ___________________________________________________________ 紧接上一篇博客,在上一篇博客中我简单的解释了那些的意思 下面我们插播一些小知识 插播一:  内存的大概

    2024年02月11日
    浏览(40)
  • 一起学算法(顺序表篇)

    1.顺序表的定义        用一段地址连续的存储单元依次存储数据的线性表被称为数据表,在Java中顺序表一般是数组或者是ArrayList实现的 先把代码放这里,接下来一一给大家进行讲解: 1.遍历的含义 对顺序表的元素进行一次访问的过程被称为遍历 2.动画演示  黄色代表第一

    2024年02月12日
    浏览(35)
  • 选购哪种护眼灯对眼睛好,让我们一起来看看吧

    在日常生活中,护眼灯已经是成为家庭流行使用的照明工具之一,护眼灯对视力是有一定帮助的,会摒弃摁掉一些日常灯具,对眼睛造成伤害的可能性,比如说蓝光,对人们的视力有不可逆的损伤,而护眼灯就过滤掉蓝光危害,还有频闪问题等等,护眼灯投射出来的光,会更

    2023年04月08日
    浏览(41)
  • 低代码平台活字格,让我们一起感受低代码平台活字格的魅力

    一份耕耘,一份收获,一段工作经历,让我认识了活字格。感觉活字格绝对是同类产品中的佼佼者。简单的拖拉拽,就实现一个完美的WEB页面,并且可做到前后端分离与交互。有了他,不擅长前端的我,也能大显身手了。告别VUE,我选活字格。用它做原型,绝对胜过Axure ,用它来

    2024年02月06日
    浏览(51)
  • ChatGPT正当时,让我们一起深耕智能内容生成和智能内容增强领域

    ChatGPT以其强大的信息整合和对话能力惊艳了全球,在自然语言处理上面表现出了惊人的能力。很多人都预测 2023 年将是 AI 生成之年,也许我们将迎来继农业革命、工业革命以来的第三种通用技术的普及。 信必优长期专注于 人工智能 领域,拥有 产品研发与测试 、 数据标注

    2023年04月18日
    浏览(48)
  • 【我们一起60天准备考研算法面试(大全)-第二十九天 29/60】【二进制】

    专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录) 文章字体风格: 红色文字表示:重难点★✔ 蓝色文字表示:思路以及想法★✔ 如果大家觉得有帮助的话,感谢大家帮

    2024年02月15日
    浏览(51)
  • 数据结构-双向链表(c++)超全超详细

    单链表结点中只有一个指向其后继的指针,使得单链表只能从头结点依次顺序地向后遍历。要访问某个结点的前驱结点(插入,删除操作时),只能从头开始遍历,访问后继结点的时间复杂度为O(1),访问前驱结点的时间复杂度为O(n)。 提示:以下是本篇文章正文内容,下面案

    2023年04月08日
    浏览(46)
  • 利用C++超详细解释数据结构中的链表

    链表(Linked List)是一种常见的数据结构,它可以动态地插入和删除元素,不需要像数组那样预先分配固定大小的内存。链表中的每个元素称为节点(Node),每个节点包含一个数据值和一个指向下一个节点的指针。本教学将涵盖以下知识点: 单向链表(Singly Linked List) 双向

    2024年02月04日
    浏览(31)
  • 一起学数据结构(2)——线性表及线性表顺序实现

    目录 1. 什么是数据结构:  1.1 数据结构的研究内容: 1.2 数据结构的基本概念: 1.2.1 逻辑结构:  1.2.2 存储结构: 2. 线性表: 2.1 线性表的基本定义: 2.2 线性表的运用: 3 .线性表的顺序表示及实现(顺序表):    3.1 顺序表的概念及结构:  3.2 顺序表的代码实现: 3.2

    2024年02月14日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包