数据结构——栈

<数据结构>——栈 📚参考资料:《数据结构C语言版》-严蔚敏 一、栈 首先,我们了解一下什么是栈? 栈是限定仅在表尾进行插入或删除操作的线性表。 表尾为栈顶,表头为栈底,不含元素的空表称为空栈。 例如, 洗干净的盘子总是逐个往上叠放在已经洗好的盘子上面 , 而用时从上往下逐个取用 还有一些案例也利用了栈: 括号的检验 我们来看这些括号,给它们标号为1-4,当出现1和2时,我们更想要先出现3,再出现4。而由于1与3配对,2与4配对,所以我们其实对于2的需求感强于对1的需求感。 1先进... 阅读详情

文章目录

1.存储结构
2.顺序栈的实现
3.链栈的实现
4.进制转换
5.括号匹配
6.行编辑程序
7.迷宫求解
8.表达式求值

1.存储结构

顺序结构
typedef struct {
ElemType *base; // 栈底指针
ElemType *top; // 栈顶指针
int stacksize; // 栈空间大小
} SqStack;
链式结构

typedef int ElemType;
typedef struct node {
ElemType data;
struct node *next;
} LinkStack;

2.顺序栈的实现(可执行程序)
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
#include<malloc.h>

typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0


// ------栈的顺序存储结构表示----------
#define STACK_INIT_SIZE 100 	// 存储空间初始分配量
#define STACK_INCREMENT 10 	// 存储空间分配增量
typedef int  ElemType;
typedef struct {
  ElemType *base; 	// 栈底指针
  ElemType *top; 	// 栈顶指针
  int stacksize; 	// 栈空间大小
} SqStack;


void InitStack(SqStack &S)
{
    // 构造一个空栈S
    if(!(S.base = (ElemType *)malloc(STACK_INIT_SIZE 
                                  * sizeof(ElemType))))
        exit(OVERFLOW);     // 存储分配失败
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
}

void DestroyStack(SqStack &S)
{
    // 销毁栈S,S不再存在
    free(S.base);
    S.base = NULL;
    S.top = NULL;
    S.stacksize = 0;
}

void Push(SqStack &S, ElemType e)
{
    if(S.top - S.base >= S.stacksize) { // 栈满,追加存储空间
        S.base = (ElemType *)realloc(S.base, (S.stacksize 
              + STACK_INCREMENT) * sizeof(ElemType));
        if(!S.base)
            exit(OVERFLOW);           // 存储分配失败
        S.top = S.base + S.stacksize;
        S.stacksize += STACK_INCREMENT;
    }
    *(S.top)++ = e;
}

Status Pop(SqStack &S, ElemType &e)
{
    // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;
    // 否则返回ERROR
    if(S.top == S.base)
        {
        	printf("此时栈为空,不可以再出栈\n");
			return ERROR;
		}
    e = *--S.top;
    printf("当前出栈的元素的值为:%d\n",e);
    
    return OK;
}

Status GetTop(SqStack S, ElemType &e)
{
    // 若栈不空,则用e返回S的栈顶元素,并返回OK;
    // 否则返回ERROR
    if(S.top > S.base) {
        e = *(S.top - 1);
        printf("输出栈顶元素为 %d \n",e);
        return OK;
    }
    else
    {
    	printf("此时栈为空,得不到栈顶元素\n");
		return ERROR;
	}
        
}

Status StackEmpty(SqStack S)
{
    // 若栈S为空栈,则返回TRUE,否则返回FALSE
    if(S.top == S.base)
        return TRUE;
    else
        return FALSE;
}





int main ()
{
	int n=1;
	ElemType e,q,temp;
	int a;
	SqStack P;
	InitStack(P);
	printf("[1]:入栈输入\n[2]:出栈输入\n[3]:得到栈顶元素输入\n[4]:判断栈是否为空\n[5]:销毁栈\n");
	while(n)
	{
		printf("输入操作:"); 
		scanf("%d",&a); 
		switch(a)
		{
			case 1: printf("入栈操作,输入要入栈的元素:"); 
					scanf("%d",&e);
					Push(P, e);
					break;
			case 2: printf("出栈操作\n"); 
				    Pop(P, q);
				    
					break;
			case 3: GetTop(P, temp);
				 	
				 	break;
			case 4: if(StackEmpty(P)) printf("当前栈为空\n");
			 			else printf("当前栈不空\n"); 
			 		break;
			case 5: printf("---正在销毁栈---\n");
			 		DestroyStack(P);
			 		break;
			 		
		}
			
	}
	
 } 
 
3.链栈的实现
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
#include<malloc.h>

typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

typedef int ElemType;
typedef struct node {
  ElemType data;
  struct node *next;
} LinkStack;

void InitStack(LinkStack *&top)
{
	top=NULL;
}

void DestroyStack(LinkStack *&top)
{  
	LinkStack *pre=top,*p;
   if (pre==NULL) return;	//考虑空栈的情况
   p=pre->next;
   while (p!=NULL)
   {  free(pre);		//释放pre结点
      pre=p;
      p=p->next;      	//pre、p同步后移
   }
   free(pre);			//释放尾结点
}

int Push(LinkStack *&top,ElemType x)	
{  
   LinkStack *p;
   p=(LinkStack *)malloc(sizeof(LinkStack));
   p->data=x;		//创建结点p用于存放x
   p->next=top;	//插入p结点作为栈顶结点
   top=p;
   return 1;
}

int Pop(LinkStack *&top,ElemType &x)	
{  
   LinkStack *p;
   if (top==NULL) //栈空,下溢出返回0
   {
   	printf("当前栈为空,不可以再出栈\n"); 
   	return 0;
   }		
      
   else				//栈不空时出栈元素x并返回1
   {	p=top;			//p指向栈顶结点
	x=p->data;		//取栈顶元素x
	 printf("当前出栈的元素的值为:%d\n",x);
	top=p->next;		//删除结点p
	free(p);		//释放p结点
	return 1;
   }
}

int GetTop(LinkStack *top,ElemType &x)
{  
   if (top==NULL)	//栈空,下溢出时返回0
     {
     	printf("此时栈为空,得不到栈顶元素\n");
		return 0;
	 }
   else			//栈不空,取栈顶元素x并返回1
   {  x=top->data;
   printf("输出栈顶元素为 %d \n",x);
      return 1;
   }
}

int StackEmpty(LinkStack *top)
{  
   if (top==NULL)
      return 1;
   else
      return 0;
}

int stack_traverse(LinkStack *&top)
{
	
	LinkStack *p;
	p=top;
	int i=1; 
	 while (p!=NULL)
   {    printf("目前栈中第 %d 个元素为 %d\n",i++,p->data);		//释放pre结点
      
      p=p->next;      	//pre、p同步后移
   }
   return 0;
	
 } 




int main ()
{
	int n=1,e,q;
	int temp;
	int a;
	int number,t;
	
	LinkStack *P;
	LinkStack *help;//用于排序 
	InitStack(P);
	InitStack(help);
	printf("----菜单-----\n"); 
	printf("1:入栈输入\n2:出栈输入 \n3:得到栈顶元素输入 \n4:判断栈是否为空\n5:销毁栈  \n6:遍历栈中的元素\n");

	while(n)
	{
		printf("输入操作:"); 
		scanf("%d",&a); 
		switch(a)
		{
			case 1: printf("入栈操作,输入要入栈的元素:"); 
					scanf("%d",&e);
					Push(P, e);
					break;
			case 2: printf("出栈操作\n"); 
				    Pop(P, q);
				   
					break;
			case 3: GetTop(P, temp);
				 	printf("输出栈顶元素为 %d \n",temp);
				 	break;
			case 4: if(StackEmpty(P)) printf("当前栈为空\n");
			 			else printf("当前栈不空\n"); 
			 		break;
			case 5: printf("---正在销毁栈---\n");
			 		DestroyStack(P);
			 		break;
			case 6: stack_traverse(P);
			 		break;
		
		}
			
	}
	
 } 
4.进制转换

栈的应用——进制转换

5.括号匹配

栈的应用——括号匹配

6.行编辑程序
7.迷宫求解
8.表达式求值

栈的应用——表达式求值

9.回文字符串

栈的应用——回文字符串

先进封装技术 Part03---重布线层(RDL)的科普 RDL是一种在芯片封装过程中用于重新分布电气连接的技术。它通过在芯片表面或中介层上形成额外的布线层,重新分配芯片的I/O(输入/输出)位置,以适应不同的封装需求和提高电气连接的灵活性。 阅读详情

相关推荐

基于Simulink的二相混合式步进电机驱动器快速建模与仿真实践

本文详细介绍了如何利用Simulink对二相混合式步进电机驱动器进行快速建模与仿真。通过从零搭建电机数学模型、设计H桥控制逻辑,并集成步进时序,手把手指导读者创建可运行的仿真模型文件。该方法能有效验证控制策略,避免硬件调试风险,是学习与实践电机驱动开发的理想途径。

weixin_29171087的博客 149

数据结构:栈「详解」

栈(Stack)是一种常见的数据结构,它是一种“后进先出”(Last In First Out,LIFO)的数据结构。栈可以看做是一种特殊的线性表,只能在栈顶进行插入和删除操作。栈顶是允许操作的,而栈底是固定的。

weixin_56433857的博客 1万+

RK3588嵌入式开发:从零构建Rockit多媒体处理引擎的实战指南

本文详细介绍了如何在RK3588嵌入式平台上从零构建Rockit多媒体处理引擎的实战指南。涵盖开发环境搭建、工具链配置、源码编译流程、硬件加速优化及典型问题解决方案,帮助开发者高效利用RK3588的NPU和VPU加速特性,实现高性能多媒体处理应用。

mango的博客 187

数据结构之——栈

数据结构之——栈 一:栈的定义: 栈是限定是限定仅在表位进行插入和删除操作的线性表,栈又称为先进后出(Last In First Out)的线性表,简称LIFO结构。 栈顶:允许插入和删除的一端称为栈顶。 栈底:不可以进行插入和删除操作。 空栈:不含任何数据元素的栈称为空栈。 理解栈的定义需要注意几点: 1:它是一个线性表,即说明栈元素具有 线性关系,即 前驱后继 关系。只不 过它是一种特殊的线性表而已。 2:定义中说在线性表的表的表尾进行插入和删除操作,注意这里表尾指的是

WenJieya的博客 7499

Windows10系统添加虚拟网卡(Microsoft Loopback Adapter)的方法

1、按下win + R键,在其中输入:hdwwiz,然后 (enter) 2、点击下一步即可 3、其次选择【网络适配器】,然后点击【下一步】。 4、在厂商处选择Microsoft,网络适配器处选择【Microsoft Loopback Adapter】选项 ,点击【下一步】。 5、通过上面几个步骤的设置后,一块虚拟网卡的安装设置就算是完成了。 ...

一个懒鬼的博客 2万+

AI 自动生成商业计划书:AIGC 如何助力创业者?

在创业的早期阶段,商业计划书(Business Plan)是至关重要的。它不仅用于吸引投资者、明确发展路径,还能帮助团队对业务模式、市场定位和财务预测有清晰认知。然而,撰写一份高质量的商业计划书往往需要投入大量时间和精力。如今,AIGC(AI Generated Content,人工智能生成内容)技术正在改变这一现状。借助 AIGC,创业者可以更快速、高效地创建商业计划书,并通过 AI 进行优化和数据分析。

2401_82808034的博客 3782

【数据结构】栈的详解

栈的结构体其实和顺序表差不多,一个动态开辟的数组,一个栈的容量。注意 top 我们要决定它指向栈顶还是栈顶的下一个元素。如果top初始化为0,则它指向栈顶的下一个元素。如果top初始化为-1,则它指向栈顶元素。我比较喜欢初始化为0,1是top还可以表示元素的个数,可以用来判断栈是否满了。2是插入元素的时候直接在top的位置插入就行,然后再top++即可。这里根据大家喜好设定就行。int top;} ST;

fighting小泽的博客 3433

揭秘Outlook/QQ邮箱伪造:如何利用Unicode编码绕过SPF检测

本文深入剖析了利用Unicode编码进行邮件显示名伪造的攻击手法,揭示了攻击者如何通过插入零宽字符等特殊编码绕过SPF检测,使邮件在Outlook、QQ邮箱等客户端中看似来自可信发件人。文章通过Python代码示例演示了伪造过程,并提供了从用户自查到管理员部署DMARC策略的多层次防御建议。

weixin_29063035的博客 334

数据结构与算法(3)栈

栈 1、栈的一个实际需求 请输入一个表达式:7x2x2-5+1-5+3-3 2、栈的介绍 栈的英文为stack 栈是一个**先入后出(FILO-First In Last Out) **的有序列表 栈(stack) 是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。 允许插入和删除的一端,为变化的一端,称为栈顶(Top) ,另一端为固定的一端,称为栈底(Bottom) 根据栈的定义可知 ,最先放入栈中元素在栈底 ,最后放入的元素在栈顶 删除元素刚好相反 ,最后

flyersboy的博客 894

STM32学习笔记【江科协】【4-2】OLED显示屏

可以注意到接电源的GND和VCC同时和PB6、PB7号口连接,我们可以直接不初始化这两个引脚解决,因为STM32的引脚上电后,如果不初始化,默认是浮空输入的模式,在这个模式下,引脚不会输出电平,所以不会有什么影响,或者直接给PB6口输出低电平,PB7口输出高电平,用GPIO口直接给OLED供电,这个也是没问题的,因为OLED的功率很小这个也是可以驱动的,不过用GPIO口供电不是很规范,实际项目还是用电源供电。然后点击这里放大镜里面带d的图标,进入调试模式,这个界面里,

m0_74651303的博客 1595

华为OD机试真题 新系统2026-04-01 Python&JS 实现【勇攀数字高峰】

请你在给定的数字地形图中寻找登山路径,数字代表当前位置的海拔高度,要求从最低海拔出发,不断攀登,最终到达最高山峰。你需要寻找所有满足条件的登山路径。地图已经保证最低海拔和最高山峰都只有一个。

MISAYAONE的博客 851

数据结构之栈和队列

数据结构之栈和队列

容铎的博客 1647

基于FPGA的最大功率点跟踪(MPPT)系统开发 - MATLAB实现

最大功率点跟踪(Maximum Power Point Tracking,MPPT)是太阳能光伏系统中的重要技术,它通过调整太阳能电池板的工作点,以最大化输出功率。通过FPGA系统设计和硬件验证,我们可以实现太阳能光伏系统中的最大功率点跟踪。这种基于FPGA的MPPT系统具有高性能和灵活性,适用于太阳能光伏系统中的实时最大功率点跟踪。MPPT算法的选择对于系统的性能至关重要。在本文中,我们选择使用Perturb and Observe(P&O)算法,它是一种常用的基于光伏阵列电压和电流测量的迭代算法。

CoderExtra的博客 387

数据结构之栈

栈是一种线性数据结构,它按照 “先进后出”(First In Last Out,FILO)的原则存储和操作数据。这意味着最后插入栈中的元素会最先被取出,就像一摞盘子,最后放上去的盘子会最先被拿走。

zzh_Zao的博客 1856

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【数据结构】栈是什么?从0理解栈的数据结构

在数据结构的学习中,栈是一种非常重要的结构。无论你是否是计算机专业,栈的概念其实并不复杂。本篇文章将帮助你从零理解栈的数据结构,了解它的基本用途、实际应用以及如何在C++中实现栈操作。

XuanRan的博客 4544

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

数据结构 栈

摘要 栈是一种后进先出(LIFO)的线性数据结构,仅允许在栈顶进行插入(push)和删除(pop)操作。其核心特性包括:仅操作栈顶、不支持随机访问、默认基于deque实现。栈的提出源于1950年代鲍尔团队对逆波兰表达式计算和函数调用机制的研究,现广泛应用于程序调用栈、表达式求值、括号匹配等场景。C++中可通过STL的std::stack或手动数组实现栈操作,基本功能包括压栈、弹栈、判空等。例题B3758展示了栈在括号匹配中的典型应用——通过栈统计未匹配括号数量,动态补全成合法序列。栈的高效性使其成为算法和系

syshrgjdkdh的博客 2240

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数据结构-栈及栈的应用

栈的概述 栈式一种重要的线性结构,属于一种操作受限的线性表 栈(stack) 是限定尽在表尾进行插入或删除操作的线性表 表尾端称为栈顶(top),表头端称为栈底(bottom) 栈的元素先进后出(后进先出),即最先进入栈的元素最后出栈 ...

初始化的博客 5106

数据结构——————栈

栈(Stack)是一种特殊的线性数据结构,其插入和删除操作都只允许在表的一端进行。这一端被称为栈顶(top),另一端则被称为栈底(bottom)。栈遵循后进先出(Last In First Out,LIFO)的规则,即最后存入的元素将被最先取出。顺序栈采用一个数组存放栈中的元素。如果需要用到两个类型相同的栈,这时若为它们各自开辟一个数组空间,极有可能出现这样的情况:第一个栈已满,再进栈就溢出了,而另一个栈还有很多空闲的存储空间。解决这个问题的方法是。

m0_66847953的博客 1383

栈—数据结构

6、获取栈顶元素(获取栈顶元素,在外面开一个空间,将该空间的地址传过去,进行获取元素,以便于区分元素还是返回值)入栈的方向是是增栈的方式,放入数据的是满栈的方式。入栈的方向是是减栈的方式,放入数据的是满栈的方式。入栈的方向是是增栈的方式,放入数据的是空栈的方式。入栈的方向是是减栈的方式,放入数据的是空栈的方式。3、出栈(看一下,出去的元素,所以和6一样)1、入栈:先放入输入,再移动栈顶指针。2、出栈:先移动栈顶指针,再数据弹出。1、入栈:先挪栈顶指针,再放入数据。2、出栈:先移出数据,再移动指针。

weixin_63722559的博客 1429

【数据结构】栈

什么是栈?栈:一种特殊的线性表其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈顶 栈底是什么,线性表又是什么?栈顶与栈底是不固定的,取决于你想在哪边操作。拿顺序表举例,若只在表尾增删,那表尾就是栈顶,相对的表头就是栈底。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈,出数据也在栈顶。因为栈一般是存储在堆上的,故栈的大小可以看作无穷大(取决于你的机器)。【数据结构】初阶——顺序表①为什么说栈是受限制的。

Kaisir777的博客 879
上一篇: 数据结构——进制转换(10—n)
下一篇: 数据结构——二叉树的最小深度算法
943802606
博客等级 码龄6年 1万+粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值