【数据结构】栈——共享栈、链栈(入栈 出栈 判空 创建 读栈顶元素)完整代码

这篇具有很好参考价值的文章主要介绍了【数据结构】栈——共享栈、链栈(入栈 出栈 判空 创建 读栈顶元素)完整代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

三 栈

1.定义

只允许在一端进行插入操作或删除的线性表。

  • 重要术语

    • 栈顶:允许 插入和删除的一端。
    • 栈底:不允许 插入删除的一端。
    • 空栈:不含任何元素的空表。
  • 出栈顺序(卡特兰数):

    n个不同元素进栈,出栈元素不同排列的个数:

    1 n + 1 C 2 n n \frac{1}{n+1} \quad C_{2n}^n n+11C2nn

2.基本操作

#include<stdio.h>

#define MaxSize 10
#define ElemType int

//定义
typedef struct {
	ElemType data[MaxSize];//静态数组存放栈中元素
	int top;//栈顶指针
}SqStack;

//初始化
void InitStack(SqStack& S)
{
	S.top = -1;//初始化栈顶指针
}

//判断栈空
bool StackEmpty(SqStack S)
{
	if (S.top == -1)
		return true;
	else
		return false;
}

//新元素入栈
bool Push(SqStack& S, ElemType x)
{
	//栈满报错
	if (S.top == MaxSize - 1)
	{
		return false;
	}

	S.data[++S.top] = x;//新元素入栈
	return true;
}

//出栈操作
bool Pop(SqStack& S, ElemType& x)
{
	//栈空,报错
	if (S.top == -1)return false;

	x = S.data[S.top--];//出栈
	return true;
}

//读栈顶元素
bool GetTop(SqStack S, ElemType& x)
{
	if (S.top == -1)return false;
	//记录栈顶元素
	x = S.data[S.top];
	return true;
}

int main()
{
	SqStack S;
	InitStack(S);

	for (int i = 0; i < 10; i++)
	{
		printf("入栈元素:%d  ", i);
		Push(S, i);
	}
	printf("入栈结束!\n\n");

	int x;
	for (int i = 0; i < 5; i++)
	{
		Pop(S, x);
		printf("出栈元素:%d  ", x);
	}
	printf("出栈结束!\n\n");

	if (!StackEmpty(S))
	{
		GetTop(S, x);
		printf("栈顶元素:%d\n", x);
	}
	return 0;
}

3.共享栈

  • 定义

    两个栈共享一片内存区域。

    一个栈将数组开头作为栈顶,另一个将数组末尾作为栈顶。

    typedef struct{
        ElemType data[MaxSize];//静态数组存放栈中元素
        int top0;//0号栈栈顶指针
        int top1;//1号栈栈顶指针
    }
    
    //初始化
    void InitStack(ShStack &S){
        S.top0=-1;//初始化栈顶指针
        S.top1=MaxSize;
    }
    
  • 栈满条件

    top0+1==top1;

4.链栈

  • 定义

    采用链式存储的栈。

  • 优点

    便于多个栈共享存储空间和提高效率,且不存在栈满上溢的情况。

  • 实现

    用单链表实现,且规定所有操作只能在单链表表头实现。文章来源地址https://www.toymoban.com/news/detail-510065.html

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ElemType int

typedef struct Linknode {
	ElemType data;//数据域
	struct Linknode* next;//指针域
}LSnode,*LiStack;//栈类型定义

//初始化
//不带头结点
bool InitList(LiStack& S)
{
	S = NULL;
	return true;
}

//判空
bool isEmpty(LiStack &S)
{
	if (S == NULL)
	{
		return true;
	}
	else
	{
		return false;
	}
}

//随机创建栈
bool Stack_Creat(LiStack& S)
{
	LSnode* t;
	int n = 10;
	srand(time(0));
	while (n--)
	{
		t = (LSnode*)malloc(sizeof(LSnode));
		t->data = rand() % 100 + 1;
		if (isEmpty(S))
		{
			t->next = NULL;
			S = t;//t作为头结点
		}
		else
		{
			t->next = S;
			S = t;
		}
	}
	return true;
}

//入栈
//插入数据为新栈顶元素
bool Stack_Push(LiStack& S, ElemType x)
{
	LSnode* t;
	t = (LSnode*)malloc(sizeof(LSnode));
	t->data = x;
	t->next = S;
	S = t;
	return true;
}

//出栈
bool Stack_Pop(LiStack& S, ElemType& x)
{
	x = S->data;
	S = S->next;
	return true;
}

//读栈顶元素
bool Stack_Top(LiStack& S, ElemType& x)
{
	x = S->data;
	return true;
}

void Stack_Print(LiStack& S)
{
	LiStack t = S;
	while (t->next != NULL)
	{
		printf("%d,", t->data);
		t = t->next;
	}
	printf("%d\n", t->data);
}

int main()
{
	LiStack S;
	InitList(S);

	printf("创建栈:\n");
	Stack_Creat(S);
	Stack_Print(S);
	printf("\n");

	int x;
	printf("请输入要添加的元素:");
	scanf_s("%d", &x);
	Stack_Push(S, x);
	Stack_Print(S);
	printf("\n");

	int y;
	Stack_Pop(S, y);
	printf("出栈元素:%d\n", y); 
	Stack_Print(S);
	printf("\n");

	int z;
	Stack_Top(S, z);
	printf("栈顶元素:%d\n", z);
}

到了这里,关于【数据结构】栈——共享栈、链栈(入栈 出栈 判空 创建 读栈顶元素)完整代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 顺序栈的基本操作(存储结构设计、初始化、判空、判满、入栈、出栈、取栈顶元素、遍历输出栈内元素)

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

    2024年02月05日
    浏览(41)
  • 数据结构:栈(Stack)的各种操作(入栈,出栈,判断栈非空,判断栈已满,附源码)

    前言: 在前面的文章中,我们讲解了 顺序表,单链表,双向链表 。而我们今天要分享的栈则是基于之前的数据结构上搭建的,但是相较于顺序表和链表来说,栈的实现就非常简单了。 目录 一.栈(Stack)的概念 二.栈的数据结构 三.栈的实现 判断栈已满 判断栈非空 入栈push 出栈

    2024年02月05日
    浏览(35)
  • 【数据结构】顺序栈的基本操作:出栈、入栈、取栈顶元素、输出所有栈中元素、括号匹配题目

    栈是限定仅在表位进行插入或删除操作的线性表。栈的表尾称为栈顶,表头称为栈底。不含元素的栈称为空栈。 左图为栈的示意图,右图为用铁路调度表示栈。 如下是入栈至栈满再进行出栈的过程示意图。值得注意的是,栈满后,top指针指向的不是顶端元素,而是顶端的下

    2024年02月07日
    浏览(52)
  • 【数据结构练习题】栈——1.括号匹配 2.逆波兰表达式求值 3.出栈入栈次序匹配 4.最小栈

    ♥♥♥♥♥个人主页♥♥♥♥♥ ♥♥♥♥♥数据结构练习题总结专栏♥♥♥♥♥ 在学习数据结构的过程中遇到了各种各样类型的题目,我在解答这些题目的时候收获了不少,所以我想开设一个专栏来分享我平时做题的收获,在我分享的题中我采用三步法来阐述,希望大家可

    2024年04月09日
    浏览(62)
  • 【数据结构】C语言实现链栈

    大家好,很高兴又和大家见面啦!!! 在上一篇内容中,我们简单介绍了一下如何解决顺序栈空间不够的方法: 在创建顺序栈前,提前在空间内容申请一篇足够大的空间; 创建一个动态的链栈; 当我们使用第一种方式时,如果我们此时需要创建的是两个同类型的顺序栈,那

    2024年01月23日
    浏览(37)
  • 数据结构:链栈(含完整代码,可复制)

           链栈是采用链式存储结构实现的栈,通常用单链表来表示。链栈的优点是不存在栈满上溢的情况(只有在内存溢出时才会出现栈满,通常不考虑)。链栈的栈顶是链表的第一个结点,栈底是链表的最后一个结点,一个链栈可以由栈顶指针唯一确定。链栈的每个结点都

    2024年02月01日
    浏览(51)
  • 【数据结构】链栈的基本操作(C语言)

    零零总总搜索了一些关于链栈的资料,了解了链栈的基本操作,一直觉得别人写的代码或多或少存在一些问题,所以打算自己写一篇关于链栈的文章,也算是对所学知识的梳理和巩固了。 首先说明本文使用C语言进行链栈的基本操作,链栈是无头结点的。这里补充说明一下,

    2024年02月05日
    浏览(55)
  • 【数据结构】 链栈的基本操作 (C语言版)

    目录 一、链栈 1、链栈的定义: 2、链栈的优缺点: 二、链栈的基本操作算法(C语言)     1、宏定义   2、创建结构体 3、链栈的初始化   4、链栈的进栈 5、链栈的出栈 6、获取栈顶元素 7、栈的遍历输出 8、链栈的判空  9、求链栈的栈长 10、链栈的清空 11、链栈的销毁

    2024年01月24日
    浏览(48)
  • 【数据结构】利用顺序栈/链栈完成表达式求值(C语言实现)

    利用顺序栈完成表达式求值(将字符型转换为整型) 程序代码: #include stdio.h #include malloc.h #include stdlib.h #include math.h #define MAXSIZE 100 #define ElemType char #define LEN sizeof ( ElemType ) typedef struct {     ElemType * data;     int top; } SqStack ; void InitStack( SqStack * S ) {     S -data = ( ElemType *)

    2024年02月05日
    浏览(51)
  • 顺序栈的入栈与出栈-----(c语言)

    栈:是限定仅在表尾进行插入和删除操作的线性表(顺序结构) 栈顶:允许插入跟删除的一端 栈底:固定的一端,不允许在栈底进行插入跟删除 入栈:栈的插入操作 出栈:栈的删除操作 目录 定义栈 创建空栈  入栈  出栈  源代码 此处定义栈的最大值为10,当然如果需要后

    2024年02月08日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包