《大话数据结构》栈——仅限定在表尾进行插入和删除操作的线性表。

本文主要是介绍《大话数据结构》栈——仅限定在表尾进行插入和删除操作的线性表。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.定义解读

栈是一个线性表,具有前后驱关系。

在线性表的表尾进行插入和删除操作,这里的表尾指的是栈顶。

2.栈的顺序表结构

#define MAXSIZE 1000
tyoedef struct
{int data[MAXSIZE];int top;//栈顶
}stack;

注意:

1)进栈操作

/*插入元素e为新的栈顶元素 */#define MAXMIZE 100typedef struct 
{int data[MAXMIZE];int top;
}stack;int push(stack *s,int e)
{s->top++;s->data[s->top]=e;if(s->top==MAXSIZE-1)return 0;return 1;
}

2)出栈操作

/*若栈不空,则删除 S的栈顶元素,用 e 返回其值,并返回 OK , 否则返回 BRROR */#define MAXMIZE 100
typedef struct
{int data[MAXMIZE];int top;
}stack;int pop(stack *s,int *e)
{*e=s->data[s->top];s->top--;if(s->top==-1)return 0;return 1;}

上述的两个均为涉及到任何循环语句,因此时间复杂度是O(1)

 

3.两栈共享空间

前提是:两个具有相同数据类型的栈

对于一个数组而言,他有两个端点,就可以当作是两个栈底,让其中一个栈底为数组的始端,即下标为0处,让另一个栈为栈的末端,即下标为数组长度的n-1处。

形成的操作是:当两个栈增加元素,就会向中间延申

 

如何判断栈满?

//栈共享空间
#define MAXSIZE 100
typedef struct
{int data[MAXSIZE];int top1;//栈顶指针int top2;//栈底指针
}dulstack;//两栈共享空间的push方法,除了要有插入元素的参数外,还需要判断是哪个栈stacknumint push(dulstack *s,int e,int stacknum)
{//这个要首先判断是否栈满,就不用担心溢出的问题了if(s->top1+1==s->top2)return 0;//栈1有元素进栈if(stacknum==1)s->top1++;s->data[s->top1]=e;//s->data[++s->top1]=e;//栈2有元素进栈else if(stacknum==2)s->top2--;s->data[s->top2]=e;//s->data[--s->top2]=e;return 1;
}/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回1,否则返回0*/
int pop(dulstack *s,int *e,int stacknum)
{if(stacknum==1){//栈1是空栈if(s->top1==-1)return 0;s->top1--;*e=s->data[s->top1];        }else if(stacknum==2){    //栈2是空栈if(s->top2==-1)return 0;s->top2++;*e=s->data[s->top2];}return 1;}

4.栈的链式存储结构

栈顶放在单链表的头部,对于栈链来说,是不需要头节点的。

对于空栈来说,链表的头指针是指向为空,那么栈链的空,其实就是top=NULL

//链栈的结构typedef struct node
{int data;struct node *next;
}node,*nodeptr;typedef struct stack
{nodeptr top;int count;
}stack;

1)进栈操作

插入数据域为e的新节点s,top为栈顶指针

tpyedef struct node
{int data;struct node *next;
}node,*nodeptr;typedef struct stack
{nodeptr top;int count;
}stack;/*插入元素 e 为新的栈顶元素*/
int push(stack *s,int e)
{nodeptr L=(nodeptr)malloc(sizeof(node));//开启了一个新nodeL->data=e;L->next=s->top;s->top=L;//新节点L赋值给栈顶指针s->count++;return 1;
}

2)出栈

将p用来作为存储要删除的栈顶节点,将栈顶指针下移一位,最后释放p

typedef struct node
{int data;struct node *next;
}node,*nodeptrtypedef struct stack
{nodeptr top;int count;
}stack;/* 若栈不空,则删除s的栈顶元素,并用e返回其值,并返回1,否则返回0*/int pop(stack *s,int *e)
{nodeptr p;//定义了一个新节点*e=s->top->data;p=s->top;//将栈顶节点的值赋值给怕,(3)s->top=s->top->next;//将栈顶指针下移一位的关键操作free(p);s->count--;if(S->next==NULL)return 0;return 1;}

 

顺序栈链栈什么时候用?

 

栈的作用:

 

 

 

 

 

 

 

 

这篇关于《大话数据结构》栈——仅限定在表尾进行插入和删除操作的线性表。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1041645

相关文章

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位

MySQL基本表查询操作汇总之单表查询+多表操作大全

《MySQL基本表查询操作汇总之单表查询+多表操作大全》本文全面介绍了MySQL单表查询与多表操作的关键技术,包括基本语法、高级查询、表别名使用、多表连接及子查询等,并提供了丰富的实例,感兴趣的朋友跟... 目录一、单表查询整合(一)通用模版展示(二)举例说明(三)注意事项(四)Mapper简单举例简单查询

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点

JAVA SpringBoot集成Jasypt进行加密、解密的详细过程

《JAVASpringBoot集成Jasypt进行加密、解密的详细过程》文章详细介绍了如何在SpringBoot项目中集成Jasypt进行加密和解密,包括Jasypt简介、如何添加依赖、配置加密密钥... 目录Java (SpringBoot) 集成 Jasypt 进行加密、解密 - 详细教程一、Jasyp

C#实现插入与删除Word文档目录的完整指南

《C#实现插入与删除Word文档目录的完整指南》在日常的办公自动化或文档处理场景中,Word文档的目录扮演着至关重要的角色,本文将深入探讨如何利用强大的第三方库Spire.Docfor.NET,在C#... 目录Spire.Doc for .NET 库:Word 文档处理利器自动化生成:C# 插入 Word

MySQL中的DELETE删除数据及注意事项

《MySQL中的DELETE删除数据及注意事项》MySQL的DELETE语句是数据库操作中不可或缺的一部分,通过合理使用索引、批量删除、避免全表删除、使用TRUNCATE、使用ORDERBY和LIMI... 目录1. 基本语法单表删除2. 高级用法使用子查询删除删除多表3. 性能优化策略使用索引批量删除避免

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE

使用Python在PDF中绘制多种图形的操作示例

《使用Python在PDF中绘制多种图形的操作示例》在进行PDF自动化处理时,人们往往首先想到的是文本生成、图片嵌入或表格绘制等常规需求,然而在许多实际业务场景中,能够在PDF中灵活绘制图形同样至关重... 目录1. 环境准备2. 创建 PDF 文档与页面3. 在 PDF 中绘制不同类型的图形python

使用Python实现在PDF中添加、导入、复制、移动与删除页面

《使用Python实现在PDF中添加、导入、复制、移动与删除页面》在日常办公和自动化任务中,我们经常需要对PDF文件进行页面级的编辑,使用Python,你可以轻松实现这些操作,而无需依赖AdobeAc... 目录1. 向 PDF 添加空白页2. 从另一个 PDF 导入页面3. 删除 PDF 中的页面4. 在