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

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

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

相关文章

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

遮罩,在指定元素上进行遮罩

废话不多说,直接上代码: ps:依赖 jquer.js 1.首先,定义一个 Overlay.js  代码如下: /*遮罩 Overlay js 对象*/function Overlay(options){//{targetId:'',viewHtml:'',viewWidth:'',viewHeight:''}try{this.state=false;//遮罩状态 true 激活,f

动手学深度学习【数据操作+数据预处理】

import osos.makedirs(os.path.join('.', 'data'), exist_ok=True)data_file = os.path.join('.', 'data', 'house_tiny.csv')with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n') # 列名f.write('NA

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87