广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言中顺序栈和链栈的定义和使用详解
  • 760
分享到

C语言中顺序栈和链栈的定义和使用详解

C语言顺序栈链栈C语言顺序栈C语言链栈 2022-11-13 18:11:20 760人浏览 薄情痞子
摘要

目录栈的基本内容顺序栈定义入栈操作出栈顺序栈的缺点出栈顺序的计算方法链栈栈的基本内容 无论是我们接下来要讲的栈还是后面要讲到的队列,他们虽然在名字上不同于我们之前的顺序表或者单链表,

栈的基本内容

无论是我们接下来要讲的栈还是后面要讲到的队列,他们虽然在名字上不同于我们之前的顺序表或者单链表,但是它们本质也是线性表,只是在基本操作上没有表那么“自由”。比如:栈只能从栈顶进行插入和删除,而队列只能从对头进行删除,队尾进行插入。

举例:

叠放在一起的盘子,当想要加入新的盘子时,只能在底部或者尾部加入,删除同样也是。

空栈:

栈顶和栈底:

顺序栈

既然上文都说到“栈”和“队列”都是一种“特殊的”线性表”,那么顺序栈,顾名思义就是按照顺序存储的栈。

定义

既然是顺序存储的,那么我们依然可以和顺序表相类似,采用数组去存放!

typedef struct {
	int data[size];
	int top;//栈顶指针
}seqstack;//seqstack为结构体类型

入栈操作

对于顺序表的插入操作,我们在栈中叫做“入栈”,由于栈的特殊性,只能在栈顶进行操作。

需要提醒的是:一定是栈顶指针先进行移动,再将新插入的元素赋给栈顶空间。也就是说S.top = S.top + 1;S.data[S.top] = x;的顺序不能发生颠倒。

void Pushstack(seqstack& S)
{
	if (S.top == size)
		printf("栈满,拒绝元素继续入栈!");
	else {
		printf("请依次输入你要入栈的元素:\n");
		int x,i;
		for (i = 0; i < size; i++) {
			scanf("%d", &x);
			S.top = S.top + 1;
			S.data[S.top] = x;
			printf("入栈成功!\n");
		}
	}
}

举例:

出栈

虽然是“出栈”,但是如果后续没有入栈操作对出栈位置进行数据覆盖的话,其实出栈并不是真正意义上的“消失”,只是在逻辑上上被删除了,其实给出下标地址,依然可以找到该元素。**return S.data[S.top];**就是将该元素的值返回,以便下次能够快速找到。

int  PopStack(seqstack& S) {
	if (S.top == -1) {
		printf("栈为空,没有元素输出!");
	}
	{
		printf("当前栈顶元素为:");
		 return S.data[S.top];
		 S.top = S.top - 1;
	}
}

关于顺序栈的其他操作都是比较简单的,这里就不一一进行讲解了,需要注意的事项我会在下面的完整代码中注释出来!

顺序栈的缺点

栈的大小不可发生变化。

出栈顺序的计算方法

如上图所示:

进栈顺序为a->b->c->d->e,则对应的出栈顺序为e->d->c->b->a

但有时候出栈和进栈是穿插进行的:

举例:

这种进栈出栈穿插的方式有很多种。

由此,我们可以得出一个结论:

链栈

既然上文都说到“栈”和“队列”都是一种“特殊的”线性表”,那么链栈,顾名思义就是按照链式存储的栈。

基本实现方法和单链表相同,这里就不一一进行讲解了,需要注意的事项我会在下面的完整代码中注释出来!

链栈完整代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define size 5
typedef struct Linknode {
	int data;
	struct LinkNode* next;
}Linkstack;

//初始化
void Iniststack(Linkstack *L) {
	L= (LinkNode*)malloc(sizeof(LinkNode));
	if (!L->data) {
		printf("申请失败");
	}
	else
	{
		L->data = 0;
		L->next = NULL;
	}
}
//入栈
void Pushstack(Linkstack *L) {
	
	int e,x;
	printf("请输入你要创建的链栈长度:");
	scanf("%d", &x);
	printf("请输入你要入栈的元素:\n");
	for (int i = 0; i < x; i++) {
		LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
		scanf("%d", &e);
		s->data = e;
		s->next = L->next;
		L->next = s;
	}	
}
//出栈
int  Popstack(Linkstack* L)
{
	LinkNode* s= L->next;
	s->data = L->data;
	L->next = s->next;
	return s->data;
}
//读取栈顶元素
int  Getstack(Linkstack* L) {
	if (!L->data)
	{
		printf("栈为空!");
	}
	else {
		int e = L->next->data;
		return e;
	}
}
//输出栈中元素
void Printsatck(Linkstack* L) {
	if (!L->data)
	{
		printf("栈为空!");
	}
	else {
		LinkNode* p;
		p = L;
		printf("栈中元素如下:");
		while (p)
		{
			p = p->next;
			printf("%d", p->data);
		}
	}
}
int main() {
	Linkstack L;
	Iniststack(&L);
	Pushstack(&L);
	Popstack(&L);
	Getstack(&L);
	Printsatck(&L);
}

输出:

顺序栈完整代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define size 5
typedef struct {
	int data[size];
	int top;
}seqstack;
//初始化操作
void InistStack(seqstack &S) {
	S.top = -1;
}
//判空操作
void IsEmpty(seqstack& S)
{
	if (S.top == -1)
		printf("目前栈为空!\n");
}
//入栈操作
void Pushstack(seqstack& S)
{
	if (S.top == size)
		printf("栈满,拒绝元素继续入栈!");
	else {
		printf("请依次输入你要入栈的元素:\n");
		int x,i;
		for (i = 0; i < size; i++) {
			scanf("%d", &x);
			S.top = S.top + 1;
			S.data[S.top] = x;
			printf("入栈成功!\n");
		}
	}
}
//读取栈顶元素
void Getstack(seqstack& S) {
	if (S.top == -1) {
		printf("栈为空,没有元素输出!");
	}
	{
		printf("当前栈顶元素为:");
		printf("%d\n", S.data[S.top]);
	}
}
//输出栈中元素
void Printstack(seqstack& S) {
	if (S.top == -1) {
		printf("栈为空,没有元素输出!");
	}
	else {
		printf("栈中元素如下:");
		for (int i = 0; i < size; i++) {
			printf("%d", S.data[i]);
		}
		printf("\n");
	}
}
//出栈
int  PopStack(seqstack& S) {
	if (S.top == -1) {
		printf("栈为空,没有元素输出!");
	}
	{
		printf("当前栈顶元素为:");
		 return S.data[S.top];
		 S.top = S.top - 1;
	}
}
//删除栈顶元素

int Deletestack(seqstack& S) {
	if (S.top == -1) {
		printf("栈为空!\n");
	}
	else
	{
		int e;
		for (int i = 0; i < size; i++) {
			e = S.data[S.top];
			S.top = S.top - 1;
			return e;
		}
		printf("所有元素已被删除!\n");
	}
}
//清栈
void Clearstack(seqstack& S) {
	S.top = -1;
	printf("栈已经被清空!\n");
}
int main() {
	seqstack S;
	int x;
	InistStack(S);
	IsEmpty(S);
	Pushstack(S);
	Getstack(S);
	Printstack(S);
	
	Deletestack(S);
	Clearstack(S);
	Printstack(S);
}

输出:

以上就是C语言中顺序栈和链栈的定义和使用详解的详细内容,更多关于C语言顺序栈 链栈的资料请关注编程网其它相关文章!

--结束END--

本文标题: C语言中顺序栈和链栈的定义和使用详解

本文链接: https://www.lsjlt.com/news/169969.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言中顺序栈和链栈的定义和使用详解
    目录栈的基本内容顺序栈定义入栈操作出栈顺序栈的缺点出栈顺序的计算方法链栈栈的基本内容 无论是我们接下来要讲的栈还是后面要讲到的队列,他们虽然在名字上不同于我们之前的顺序表或者单链表,...
    99+
    2022-11-13
    C语言 顺序栈 链栈 C语言 顺序栈 C语言 链栈
  • C语言函数栈帧的创建和销毁详解
    目录写在前面Add函数的调用函数传参Add函数栈帧的创建Add函数栈帧的销毁main函数栈帧的销毁总结写在前面 我们知道,每一次函数调用都需要在栈区上为其开辟一块空间,这块空间就叫做...
    99+
    2022-11-13
  • 详解C语言结构体的定义和使用
    目录1.1:结构体用来干嘛?1.2:结构体变量的基本定义格式1.3:结构体变量的定义1.4结构体变量的三种引用方法2.结构体变量的使用(直接使用结构体变量)2.1输出结果3....
    99+
    2022-11-12
  • c语言函数栈帧的创建和销毁过程详解
    目录1 相关知识介绍 1.1 寄存器1.2 函数栈帧概述2 栈帧创建与销毁过程1 相关知识介绍  1.1 寄存器 一般计算机内通用寄存器包括eax,ebx,ec...
    99+
    2022-11-12
  • C语言超详细讲解函数栈帧的创建和销毁
    目录1、本节目标2、相关寄存器3、相关汇编指令4、什么是函数栈帧5、什么是调用堆栈6、函数栈帧的创建和销毁(1)、main函数栈帧的创建与初始化(2)、main函数的核心代码(3)、...
    99+
    2022-11-13
  • C语言详尽图解函数栈帧的创建和销毁实现
    目录常见寄存器基本的汇编语言知识具体实现关于栈帧创建与销毁的问答题注:本文章所使用的编译器是VS2010,由于不同编译器的函数栈帧与销毁略有差异,所以具体细节请读者自行实践! 常见寄...
    99+
    2022-11-13
  • C语言结构体数组的定义和使用详解
    目录介绍结构体数组定义时初始化补充介绍 一个结构体变量可以存放一个学生的一组信息,可是如果有 10 个学生呢?难道要定义 10 个结构体变量吗?难道上面的程序要复制和粘贴 10 次吗...
    99+
    2022-11-12
  • C语言中栈的结构和函数接口的使用示例
    目录一、栈的结构二、栈的函数接口1. 初始化和销毁2. 入栈和出栈3. 访问栈顶元素以及判空和元素个数一、栈的结构 栈:一种操作受限的线性表,只允许在线性表的一端进行插入和删除操作,...
    99+
    2023-02-14
    C语言栈的结构 C语言栈的函数接口
  • C语言#define定义宏的使用详解
    目录1.宏是什么2.宏的用法3. 宏的注意事项4. 宏和函数的区别5.命名要求6. 条件编译常见条件编译指令及应用场景1.宏是什么 #define 机制包括了一个规定,允许把参数替换...
    99+
    2022-11-13
    C语言#define定义宏 C语言 #define
  • C语言深入讲解栈与堆和静态存储区的使用
    目录一、程序中的栈二、函数的调用过程三、函数调用的栈变化四、函数调用栈上的数据五、程序中的堆六、程序中的静态存储区七、小结一、程序中的栈 栈是现代计算机程序里最为重要的概念之一栈在程...
    99+
    2022-11-13
  • C语言中定义和使用特殊标准
    本篇文章给大家分享的是有关C语言中定义和使用特殊标准,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、ANSI C特殊标准定义罗列一些常见的特殊定义:__FILE__:正在编译...
    99+
    2023-06-16
  • C语言的函数怎么定义和使用
    本篇内容主要讲解“C语言的函数怎么定义和使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言的函数怎么定义和使用”吧!关于函数函数是C语言的基本单元,函数中包含实现程序功能的代码。C语言程序...
    99+
    2023-06-30
  • C语言详细讲解接续符和转义符的使用
    目录一、接续符的意义二、接续符的使用三、转义符的意义四、转义符的使用五、转义符和其他的语法混合六、小结一、接续符的意义 C语言中的接续符(\)是指示编译器行为的利器 下面看一段接续符...
    99+
    2022-11-13
  • C语言中dlopen和dlsym的使用方式详解
    目录背景demo生产动态库调用dlopen总结背景 为了是不同的逻辑解耦,一般会把各个业务封装成动态库,然后主逻辑去调用各个插件。这里有个问题是,为什么以前我们都是通过include...
    99+
    2022-11-13
  • C语言中定义和使用的特殊标准是什么
    本文小编为大家详细介绍“C语言中定义和使用的特殊标准是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言中定义和使用的特殊标准是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、ANSI C特殊标准定...
    99+
    2023-06-16
  • C语言strlen和sizeof在数组中的使用详解
    目录一、前言二、sizeof在二维数组的试题解读:题解:答案验证:64位平台下:32位平台下:一、前言 前面我们详细讲了sizeof和strlen中的使用,基本涉及了所有一维数组可以...
    99+
    2022-11-12
  • 如何进行C语言结构体的定义和使用
    本篇文章为大家展示了如何进行C语言结构体的定义和使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.1: 结构体用来干嘛生活中我们会遇到很多的表格,就比如你的学习成绩表,有姓名 ,学号,各科的成绩...
    99+
    2023-06-22
  • C语言中的自定义类型之结构体与枚举和联合详解
    目录1.结构体1.1结构的基础知识1.2结构的声明1.3特殊的声明1.4结构的自引用1.5结构体变量的定义和初始化1.6结构体内存对齐1.7修改默认对齐数1.8结构体传参2.位段2....
    99+
    2022-11-13
  • C语言自定义数据类型的结构体、枚举和联合详解
    结构体基础知识 首先结构体的出现是因为我们使用C语言的基本类型无法满足我们的需求,比如我们要描述一本书,就需要书名,作者,价格,出版社等等一系列的属性,无疑C语言的基本数据类型无法解...
    99+
    2022-11-12
  • c语言中static和extern的用法详细解析
    一,static和extern:大工程下我们会碰到很多源文档。文档a.c复制代码 代码如下:static int i; //只在a文档中用int j;  &nbs...
    99+
    2022-11-15
    c语言 extern static
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作