线性表之栈

主要内容

一.栈

栈是一种数据结构,它是一种只能在一端进行插入或删除操作的线性表。栈的特点是后进先出,即最后入栈的元素最先出栈。

栈的基本操作包括:

  1. 入栈:向栈顶插入一个新元素。
  2. 出栈:从栈顶删除一个元素,并返回该元素的值。
  3. 获取栈顶元素:返回栈顶元素的值,但不删除它。
  4. 判断栈是否为空:检查栈中是否有元素。
  5. 获取栈的大小:返回栈中元素的个数。

1.栈的初始化、判空、进栈、出栈和栈顶元素操作

代码如下(示例):

C语言实现:

#include <stdio.h>
#include <stdlib.h>#define MAXSIZE 100typedef struct {int data[MAXSIZE];int top;
} Stack;// 初始化栈
void initStack(Stack *s) {s->top = -1;
}// 判栈空
int isEmpty(Stack *s) {return s->top == -1;
}// 进栈
void push(Stack *s, int value) {if (s->top == MAXSIZE - 1) {printf("Stack overflow\n");return;}s->data[++s->top] = value;
}// 出栈
int pop(Stack *s) {if (isEmpty(s)) {printf("Stack underflow\n");exit(1);}return s->data[s->top--];
}// 读栈顶元素
int top(Stack *s) {if (isEmpty(s)) {printf("Stack is empty\n");exit(1);}return s->data[s->top];
}int main() {Stack s;initStack(&s);push(&s, 1);push(&s, 2);push(&s, 3);printf("Top element: %d\n", top(&s));printf("Pop: %d\n", pop(&s));printf("Top element: %d\n", top(&s));return 0;
}

Python实现:

class Stack:def __init__(self):self.data = []def is_empty(self):return len(self.data) == 0def push(self, value):self.data.append(value)def pop(self):if self.is_empty():print("Stack underflow")returnreturn self.data.pop()def top(self):if self.is_empty():print("Stack is empty")returnreturn self.data[-1]s = Stack()
s.push(1)
s.push(2)
s.push(3)
print("Top element:", s.top())
print("Pop:", s.pop())
print("Top element:", s.top())

2.共享栈

共享栈是一种数据结构,它是两个栈共享同一片内存空间的一种实现方式。在共享栈中,两个栈的栈底分别位于共享空间的两端,它们向中间生长,当它们的栈顶指针相遇时,表示栈满。

  • 共享栈的实现方式有多种,其中一种常见的方式是使用两个指针分别指向共享空间的两端,当两个栈的元素个数相等时,它们的栈顶指针相遇。这种实现方式可以节省空间,但需要额外的逻辑来处理栈满和栈空的情况。

  • 共享栈可以用于实现两个栈共享同一片内存空间的场景,比如在编译器中用于实现函数调用的参数传递和返回值的存储。共享栈也可以用于解决空间限制的问题,比如在嵌入式系统中用于管理有限的内存空间。

C语言代码:

#include <stdio.h>
#define MAXSIZE 100typedef struct {int data[MAXSIZE];int top1;int top2;
} ShareStack;void initStack(ShareStack *stack) {stack->top1 = -1;stack->top2 = MAXSIZE;
}int push(ShareStack *stack, int stackNum, int value) {if (stack->top1 + 1 == stack->top2) {printf("Stack is full\n");return -1;}if (stackNum == 1) {stack->data[++stack->top1] = value;} else if (stackNum == 2) {stack->data[--stack->top2] = value;} else {printf("Invalid stack number\n");return -1;}return 0;
}int pop(ShareStack *stack, int stackNum) {if (stackNum == 1) {if (stack->top1 == -1) {printf("Stack 1 is empty\n");return -1;}return stack->data[stack->top1--];} else if (stackNum == 2) {if (stack->top2 == MAXSIZE) {printf("Stack 2 is empty\n");return -1;}return stack->data[stack->top2++];} else {printf("Invalid stack number\n");return -1;}
}int main() {ShareStack stack;initStack(&stack);push(&stack, 1, 10);push(&stack, 2, 20);printf("Popped value from stack 1: %d\n", pop(&stack, 1));printf("Popped value from stack 2: %d\n", pop(&stack, 2));return 0;
}

Python代码:

class ShareStack:def __init__(self):self.data = [0] * 100self.top1 = -1self.top2 = 100def push(self, stackNum, value):if self.top1 + 1 == self.top2:print("Stack is full")return -1if stackNum == 1:self.top1 += 1self.data[self.top1] = valueelif stackNum == 2:self.top2 -= 1self.data[self.top2] = valueelse:print("Invalid stack number")return -1return 0def pop(self, stackNum):if stackNum == 1:if self.top1 == -1:print("Stack 1 is empty")return -1value = self.data[self.top1]self.top1 -= 1return valueelif stackNum == 2:if self.top2 == 100:print("Stack 2 is empty")return -1value = self.data[self.top2]self.top2 += 1return valueelse:print("Invalid stack number")return -1stack = ShareStack()
stack.push(1, 10)
stack.push(2, 20)
print("Popped value from stack 1:", stack.pop(1))
print("Popped value from stack 2:", stack.pop(2))

3.栈的链式存储结构

链式存储栈是一种使用链表来实现的栈结构。在链式存储栈中,每个元素都是一个节点,节点包含数据和指向下一个节点的指针。链式存储栈可以动态地分配内存空间,不需要预先指定栈的大小,因此可以灵活地处理不同大小的数据。

  • 链式存储栈的用法与普通栈类似,它支持入栈(push)、出栈(pop)、获取栈顶元素(top)和判断栈是否为空(empty)等操作。通过指针的指向,可以方便地在链表中进行插入和删除操作,使得链式存储栈在处理动态数据时更加高效。

C语言实现:

#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node* next;
} Node;typedef struct Stack {Node* top;
} Stack;void push(Stack* stack, int value) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = value;newNode->next = stack->top;stack->top = newNode;
}int pop(Stack* stack) {if (stack->top == NULL) {printf("Stack is empty\n");return -1;}int value = stack->top->data;Node* temp = stack->top;stack->top = stack->top->next;free(temp);return value;
}int isEmpty(Stack* stack) {return stack->top == NULL;
}int top(Stack* stack) {if (stack->top == NULL) {printf("Stack is empty\n");return -1;}return stack->top->data;
}int main() {Stack* stack = (Stack*)malloc(sizeof(Stack));stack->top = NULL;push(stack, 1);push(stack, 2);push(stack, 3);printf("Top element: %d\n", top(stack));printf("Pop element: %d\n", pop(stack));printf("Pop element: %d\n", pop(stack));printf("Pop element: %d\n", pop(stack));printf("Pop element: %d\n", pop(stack));free(stack);return 0;
}

Python实现:

class Node:def __init__(self, data):self.data = dataself.next = Noneclass Stack:def __init__(self):self.top = Nonedef push(self, value):new_node = Node(value)new_node.next = self.topself.top = new_nodedef pop(self):if self.top is None:print("Stack is empty")return -1value = self.top.dataself.top = self.top.nextreturn valuedef is_empty(self):return self.top is Nonedef get_top(self):if self.top is None:print("Stack is empty")return -1return self.top.datastack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)print("Top element:", stack.get_top())print("Pop element:", stack.pop())
print("Pop element:", stack.pop())
print("Pop element:", stack.pop())
print("Pop element:", stack.pop())

总结

以上是今天要讲的内容,学到了栈相关的知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/179254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#面向对象

过程类似函数只能执行没有返回值 函数不仅能执行&#xff0c;还可以返回结果 1、面向过程 a 把完成某一需求的所有步骤 从头到尾 逐步实现 b 根据开发需求&#xff0c;将某些 功能独立 的代码 封装 成一个又一个 函数 c 最后完成的代码就是顺序的调用不同的函数 特点 1、…

torch::和at:: factory function的差別

torch::和at:: factory function的差別 前言torch::autograd::THPVariable_randtorch::rand_symintat::rand_symintdemotorch命名空間at命名空間 前言 >>> import torch >>> a torch.rand(3, 4) >>> a.requires_grad False >>> a torch…

【问题系列】消费者与MQ连接断开问题解决方案(二)

1. 问题描述 当使用RabbitMQ作为中间件&#xff0c;而消费者为服务时&#xff0c;可能会出现以下情况&#xff1a;在长时间没有消息传递后&#xff0c;消费者与RabbitMQ之间出现连接断开&#xff0c;导致无法处理新消息。解决这一问题的方法是重启Python消费者服务&#xff0c;…

C# 模拟鼠标操作工具类

写在前面 用WinForm做RPA项目时经常需要模拟鼠标操作&#xff0c;通过调用Windows Api 可以实现控制鼠标的移动、点击以及滚轮滚动&#xff0c;做到跟人工一样的操作。 代码实现 public static class MouseKeyController{[DllImport("user32")]private static exte…

【前端】js 多个并行的Promise阻塞工具 指定同时执行数量

“多线程”Promise 工具类 vue that this 或者用 全局变量 map {count:0} //阻塞并获取额度 await WTool.Thread.sleepLimit(that, 变量名称, 500) await WTool.Thread.sleepLimit(map, count, 500) Thread:{/*** 阻塞x毫秒* 使用方法* await sleep&#xff08;5000&…

大数据平台/大数据技术与原理-实验报告--部署ZooKeeper集群和实战ZooKeeper

实验名称 部署ZooKeeper集群和实战ZooKeeper 实验性质 &#xff08;必修、选修&#xff09; 必修 实验类型&#xff08;验证、设计、创新、综合&#xff09; 综合 实验课时 2 实验日期 2023.11.04-2023.11.05 实验仪器设备以及实验软硬件要求 专业实验室&#xff08…

Spring Boot 3.2.0 Tomcat虚拟线程初体验 (部分装配解析)

写在前面 spring boot 3 已经提供了对虚拟线程的支持。 虚拟线程和平台线程主要区别在于&#xff0c;虚拟线程在运行周期内不依赖操作系统线程&#xff1a;它们与硬件脱钩&#xff0c;因此被称为 “虚拟”。这种解耦是由 JVM 提供的抽象层赋予的。 虚拟线程的运行成本远低于平…

如何使用APP UI自动化测试提高测试效率与质量?

pythonappium自动化测试系列就要告一段落了&#xff0c;本篇博客咱们做个小结。 首先想要说明一下&#xff0c;APP自动化测试可能很多公司不用&#xff0c;但也是大部分自动化测试工程师、高级测试工程师岗位招聘信息上要求的&#xff0c;所以为了更好的待遇&#xff0c;我们还…

C++11『右值引用 ‖ 完美转发 ‖ 新增类功能 ‖ 可变参数模板』

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f383;操作环境&#xff1a; Visual Studio 2022 版本 17.6.5 文章目录 &#x1f307;前言&#x1f3d9;️正文1.右值引用1.1.什么是右值引用&#xff1f;1.2.move 转移资源1.3.左值引用 vs …

石油化工专业MR仿真情景教学演练

首先&#xff0c;MR混合现实情景实训教学系统为学生提供了一个高度仿真的学习环境。在这个环境中&#xff0c;学生可以亲自操作设备&#xff0c;进行模拟实验&#xff0c;甚至可以体验到工业事故的模拟情景&#xff0c;从而更好地理解工艺流程的复杂性和安全性。这种沉浸式的学…

Java中的jvm——面试题+答案(方法区、代理、本地方法接口等)——第14期

涵盖更多深入的主题&#xff0c;包括性能调优、内存模型、类加载机制等。 什么是Java的内存模型&#xff08;Java Memory Model&#xff09;&#xff1f;它的目的是什么&#xff1f; 答案&#xff1a; Java内存模型定义了多线程程序中各个线程如何访问共享的内存&#xff0c;确…

CSS问题:如何实现瀑布流布局?

前端功能问题系列文章&#xff0c;点击上方合集↑ 序言 大家好&#xff0c;我是大澈&#xff01; 本文约2500字&#xff0c;整篇阅读大约需要4分钟。 本文主要内容分三部分&#xff0c;如果您只需要解决问题&#xff0c;请阅读第一、二部分即可。如果您有更多时间&#xff…

【Python百宝箱】自动化魔法大揭秘:探索强大的自动化工具与技术

前言 在当今数字化时代&#xff0c;机器人流程自动化成为提高工作效率、减少人工重复性工作负担的关键技术之一。通过智能化的自动化工具和框架&#xff0c;开发者能够轻松地实现对图形用户界面的模拟操作、测试任务的自动执行&#xff0c;以及多平台移动应用的自动化测试。本…

JavaEE进阶学习:Bean 作用域和生命周期

1.Bean 作用域 .通过一个案例来看 Bean 作用域的问题 假设现在有一个公共的 Bean&#xff0c;提供给 A 用户和 B 用户使用&#xff0c;然而在使用的途中 A 用户却“悄悄”地修改了公共 Bean 的数据&#xff0c;导致 B 用户在使用时发生了预期之外的逻辑错误。 我们预期的结果…

colab notebook导出为PDF

目录 方法一&#xff1a;使用浏览器打印功能 方法二&#xff1a;使用nbconvert转换 方法三&#xff1a;在线转换 方法一&#xff1a;使用浏览器打印功能 一般快捷键是CTRLP 然后改变目标打印机为另存为PDF 这样就可以将notebook保存为PDF了 方法二&#xff1a;使用nbconver…

芯片技术前沿:了解构现代集成电路的设计与制造

芯片技术前沿&#xff1a;解构现代集成电路的设计与制造 摘要&#xff1a;本文将深入探讨芯片技术的最新进展&#xff0c;重点关注集成电路的设计与制造。我们将带领读者了解芯片设计的基本流程&#xff0c;包括电路分析、版图设计和验证等步骤&#xff0c;并介绍当前主流的制…

强化学习中的深度Q网络

深度 Q 网络&#xff08;Deep Q-Network&#xff0c;DQN&#xff09;是一种结合了深度学习和强化学习的方法&#xff0c;用于解决离散状态和离散动作空间的强化学习问题。DQN 的核心思想是使用深度神经网络来近似 Q 函数&#xff0c;从而学习复杂环境中的最优策略。 以下是 DQN…

Kubernetes之kubeadm日志展示篇—K8S私有云worker节点gluster安装部署

文章目录 一. 服务器信息1.1 环境准备1.2 配置hosts解析记录 二. 安装与部署2.1 配置仓库 &#xff08;所有节点&#xff09;2.2 安装服务 &#xff08;所有节点&#xff09;2.3 启动服务 &#xff08;所有节点&#xff09;2.4 配置资源池 &#xff08;主节点&#xff09;2.5 创…

【C++】日期类的实现

在上篇博客中我们已经学习了C中的运算符重载&#xff0c;我们说&#xff0c;操作符只能对于内置类型进行操作&#xff0c;对自定义类型我们需要自己定义函数去实现一系列的操作 那么这篇博客我们就专门把日期这个类单独拿出来写一下它都有哪些有意义的可以重载的运算符&#xf…