数据结构-----栈(栈的初始化、建立、入栈、出栈、遍历、清空等操作)

这篇具有很好参考价值的文章主要介绍了数据结构-----栈(栈的初始化、建立、入栈、出栈、遍历、清空等操作)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

1.定义

2.栈的特点

3.栈的储存方式

3.1数组栈

3.2链栈

 4.栈的基本操作(C语言)

4.1初始化 

 4.2判断是否满栈

4.3判断空栈

 4.4 入栈

4.5 出栈

4.6获取栈顶元素

 4.7遍历栈

 4.8清空栈

 完整代码示例


前言

        大家好呀!今天我们开始学习新的线性表结构----栈,前面我们学习了链表以及链表的相关操作,那么栈跟链表有什么区别呢,操作如何呢?下面就一起来看看吧!

1.定义

        栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

2.栈的特点

        栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

        栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为出栈/退栈(POP)。栈也称为先进后出表。

 数据结构-----栈(栈的初始化、建立、入栈、出栈、遍历、清空等操作),数据结构与算法,数据结构,算法,c语言,c++

3.栈的储存方式

栈的存储方式有两种:数组栈链栈,即栈的数组存储和链式存储。

 数组栈:数组栈是通过数组的形式去存放数据的,然后定义一个栈顶top指针指向当前栈顶的位置,这个位置也就是数组最后一个位置

链表栈:链表栈就是去通过链表节点的形式去储存数据,然后建立链式结构,对这个链表进行栈的相关操作,以达到栈的特点。二者的节点写法分别如下所示:

3.1数组栈
//01 数组栈
typedef struct sqstack {
	ElemType date[Maxsize];//数据
	int top;//数组栈的栈顶指针
}SqStack;
3.2链栈
//02链表栈
typedef struct linknode {
	ElemType date[Maxsize];//数据
	struct linknode* next;//指向下一个节点的指针
}* LiStack;

(本文主要讲解数组栈) 

 4.栈的基本操作(C语言)

 栈的操作方法有以下方法:

#include<stdio.h>
#include<string.h>
#define Maxsize 10//最大空间容量

//数据类型
typedef struct datatype {
	int age;
	char name[10];
}ElemType;

//数组栈
typedef struct sqstack {
	ElemType date[Maxsize];//数据
	int top;//数组栈的栈顶指针
}Stack;

initStack(Stack *L);//初始化栈

isFull(Stack *L);//判断是否满栈

isEmpty(Stack *L);//判断是否空栈

push(Stack *L,ElemType date);//入栈

pop(Stack *L);//出栈

top_date(Stack* L);//获取栈顶元素

show_stack(Stack *L);//遍历栈

clear_stack(Stack *L);//清空栈元素

【注:以上均是数组栈的操作方法】

4.1初始化 

让栈顶元素初始化为-1,即 L->top=-1;

//初始化
void initStack(Stack *L) {
	L->top = -1;
}
 4.2判断是否满栈

判断满栈的方法就是看栈顶元素位置是否达到最大容量

//判断是否满了
int isfull(Stack *L) {
	if (L->top == Maxsize - 1) {//此时栈已满
		printf("The stack is full\n");
		return 1;
	}
	return 0;
}
4.3判断空栈

同样的判断是否空栈,只需要看栈顶top的位置是否为初始化的时候,即L->top==-1

//判断是否为空栈
int isEmpty(Stack *L) {
	if (L->top == -1) {
		printf("The stack is empty\n");
		return 1;
	}
	return 0;
}
 4.4 入栈

进行入栈操作的时候,每次放入一个数据后,栈顶指针依次向上移动一位即可,如图所示:

数据结构-----栈(栈的初始化、建立、入栈、出栈、遍历、清空等操作),数据结构与算法,数据结构,算法,c语言,c++

//入栈
void push(Stack *L,ElemType date){
	if (isfull(L)) {  //判断栈是否满了
		printf("failed to push\n");
		return;
	}
	else {
        L->top+=1;
		L->date[L->top].age = date.age;
		strcpy(L->date[L->top].name, date.name);
	}
}
4.5 出栈

进行出栈操作时,取出栈顶元素后,栈顶指针依次向下移动一位,如下所示:

数据结构-----栈(栈的初始化、建立、入栈、出栈、遍历、清空等操作),数据结构与算法,数据结构,算法,c语言,c++

//出栈
ElemType pop(Stack *L) {
	ElemType pop_date = { 0 };
	//先判断是不是空栈
	if (isEmpty(L)) {
		return pop_date;
	}
	pop_date = L->date[L->top];
	L->top--;
	return pop_date;
}
4.6获取栈顶元素

获取栈顶元素就不进行出栈操作,直接返回栈顶元素即可。

//获取栈顶元素(不出栈)
ElemType get_topdate(Stack* L) {
	return L->date[L->top];
}
 4.7遍历栈

遍历栈,即当栈不为空的时候,从栈顶开始往下依次输出数据即可。

//遍历栈,输出数据
void show_stack(Stack *L) {
	if (!isEmpty(L)) {
		for (int i = L->top; i >= 0; i--) {
			printf("%d %s\n", L->date[i].age, L->date[i].name);
		}
	}
}
 4.8清空栈

清空栈,只需要让栈顶指针回归到初始化即可,L->top=-1;

//清空栈
void clear_stack(Stack *L) {
	L->top = -1;//直接让栈顶回归就行了
	//之前的那些数据不会被删除,但是引索找不到了,下次入栈就会把这些数据给覆盖掉
}

 完整代码示例

#include<stdio.h>
#include<string.h>
#define Maxsize 10//设置最大空间容量

typedef struct datatype {
	int age;
	char name[10];
}ElemType;
// 数组栈
typedef struct sqstack {
	ElemType date[Maxsize];//数据
	int top;//数组栈的栈顶指针
}Stack;

//初始化
void initStack(Stack *L) {
	L->top = -1;
}

//判断是否满了
int isfull(Stack *L) {
	if (L->top == Maxsize - 1) {//此时栈已满
		printf("The stack is full\,");
		return 1;
	}
	return 0;
}

//入栈
void push(Stack *L,ElemType date){
	if (isfull(L)) {
		printf("failed to push\n");
		return;
	}
	else {
		L->top+=1;
		L->date[L->top].age = date.age;
		strcpy(L->date[L->top].name, date.name);
	}
}

//判断是否为空栈
int isEmpty(Stack *L) {
	if (L->top == -1) {
		printf("The stack is empty\n");
		return 1;
	}
	return 0;
}

//出栈
ElemType pop(Stack *L) {
	ElemType pop_date = { 0 };
	//先判断是不是空栈
	if (isEmpty(L)) {
		return pop_date;
	}
	pop_date = L->date[L->top];
	L->top--;
	return pop_date;
}

//获取栈顶元素(不出栈)
ElemType get_topdate(Stack* L) {
	return L->date[L->top];
}

//清空栈
void clear_stack(Stack *L) {
	L->top = -1;//直接让栈顶回归就行了
	//之前的那些数据不会被删除,但是引索找不到了,下次入栈就会把这些数据给覆盖掉
}

//遍历栈,输出数据
void show_stack(Stack *L) {
	if (!isEmpty(L)) {
		for (int i = L->top; i >= 0; i--) {
			printf("%d %s\n", L->date[i].age, L->date[i].name);
		}
	}
}

int main() {
	Stack stack ;
	ElemType date[4] = { {15,"Jack"},{16,"Amy"} ,{15,"John"},{17,"Tom"}};
	initStack(&stack);
	for(int i=0;i<4;i++)
		push(&stack, date[i]);//依次入栈
	show_stack(&stack);	//遍历栈
	ElemType pop_date= pop(&stack);//出栈
	printf("出栈元素为:%d %s\n", pop_date.age, pop_date.name);
	ElemType top_date = get_topdate(&stack);//获取栈顶元素
	printf("栈顶元素为:%d %s\n", top_date.age, top_date.name);
	clear_stack(&stack);//清空栈
}
//测试结果
/*17 Tom
15 John
16 Amy
15 Jack
出栈元素为:17 Tom
栈顶元素为:15 John*/

好啦,以上就是本期的全部内容了,我们下一期再见!see you!

分享一张壁纸: 数据结构-----栈(栈的初始化、建立、入栈、出栈、遍历、清空等操作),数据结构与算法,数据结构,算法,c语言,c++文章来源地址https://www.toymoban.com/news/detail-737110.html

到了这里,关于数据结构-----栈(栈的初始化、建立、入栈、出栈、遍历、清空等操作)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 数据结构_链表_双向循环链表的初始化、插入、删除、修改、查询打印(基于C语言实现)

    版本: 2024年4月26日 V1.0 发布于博客园 目录 目录 双向循环链表公式 初始化双向循环链表 构建双向循环链表结点 创建一个空链表(仅头结点) 创建一个新结点 插入数据 头插 中插 尾插 删除数据 头删 中删 尾删 查询打印数据 遍历打印 测试 测试结果: 完整代码 DoubleCirLList.h

    2024年04月27日
    浏览(55)
  • 数据结构_链表_单向循环链表的初始化、插入、删除、修改、查询打印(基于C语言实现)

    版本: 2024年4月25日 V1.0 发布于博客园 目录 目录 单向循环链表公式 初始化单向循环链表 构建单向循环链表结点 创建一个空链表(仅头结点) 创建一个新结点 插入数据 头插 中插 尾插 删除数据 头删 中删 尾删 查询打印数据 遍历打印 测试 测试结果: 完整代码 CircularLinkedLis

    2024年04月25日
    浏览(51)
  • 顺序栈的基本操作(存储结构设计、初始化、判空、判满、入栈、出栈、取栈顶元素、遍历输出栈内元素)

    以上为总的代码,对于栈满时存在一些问题待改进 ———————————————————————————————————————— 以下为代码编写过程,有参考网上大佬的代码   创建栈后报错,在scanf_s处缺少符号  会执行两遍创建栈?   在主函数里边确实有两

    2024年02月05日
    浏览(42)
  • 【数据结构】线性表(六)堆栈:顺序栈及其基本操作(初始化、判空、判满、入栈、出栈、存取栈顶元素、清空栈)

       堆栈Stack 和 队列Queue 是两种非常重要的数据结构,两者都是特殊的线性表: 对于堆栈,所有的插入和删除(以至几乎所有的存取)都是在表的同一端进行 对于队列,所有的插入都是在表的一端进行,所有的删除(以至几乎所有的存取)都是在表的另一端进行。    堆

    2024年02月07日
    浏览(46)
  • 【C++】【数据结构】循环队列的基本操作(初始化、入队、出队、取队头元素、遍历输出队列、求队列长度)顺序队列的算法实现【附全代码】

    使用c++完成数据结构循环队列的基本操作,包括(初始化、入队、出队、取队头元素、遍历输出队列、求队列长度等),可直接编译运行。 队列 又称为 “先进先出” (FIFO)线性表。限定插入操作只能在队尾进行,而删除操作只能在队首进行。 循环队列 ——采用 顺序存储结构

    2023年04月16日
    浏览(53)
  • 顺序栈的初始化、构建、入栈,出栈和取栈顶元素

    算法步骤: ①为顺序栈分配一个最大容量为MAXSIZE的数组空间,使base指向这段空间的基地址(栈底); ②栈顶指针top初始为base,表示栈为空; ③stacksize置为栈的最大容量MAXSIZE; 算法步骤: ①判断栈是否为满,若满则返回ERROR; ②将新元素压入栈顶,栈顶指针+1; 算法步

    2024年02月07日
    浏览(46)
  • Git初始化提交项目代码并与远端建立连接

    闲来无事,炒个冷饭。。。 方法一: 执行命令(使用git bash或者类似工具,或者IDEA下terminal命令行): 会在当前目录下创建一个新的空Git库。 方法二: 在IDEA中,执行如下操作也可: 此时当前项目下就生成了.git存储库。 执行命令,将当前目录下所有修改添加到git库里: 提交

    2024年02月15日
    浏览(56)
  • C++结构体初始化方法

    在 C++ 里可以将结构体看作没有任何成员函数的对象,下面对 C++ 结构体的几种初始化方法进行总结。 如果只是想全部初始化为 0 可以按照如下方法 结构体包含数组(数组在结构体变量定义完就初始化为0) 直接赋值的方法虽然很直观,但是如果需要初始化多个结构体变量,

    2024年02月16日
    浏览(51)
  • C语言结构体的初始化方式

    逐个初始化字段 :这是最直接的方式,你可以逐个为结构体的每个字段进行初始化。 2.使用结构体字面值初始化 :这种方式允许你在初始化时使用一个字面值来为结构体提供初始值 3. 全局初始化 :在全局范围内,你可以在变量声明时就进行初始化。 4. 使用  memset  函数 :

    2024年02月09日
    浏览(57)
  • C语言:结构体数组的使用和初始化:

    前文:在C语言中,结构体是经常会用到的自定义数据类型,通常在使用结构体时,我们会进行单一的结构体初始化。但在使用同一个结构体,初始化不同的数据时,则可以用到结构体数组来进行初始化。 结构体数组是指在一个数组中存储多个结构体对象的集合。结构体是一

    2024年02月04日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包