数据结构之栈的实现与排序详解与示例(C, C#, C++)

文章目录

    • 栈的基本操作
    • 栈的排序
    • 总结

在这里插入图片描述


栈是一种后进先出(Last In First Out, LIFO)的数据结构。在栈中,元素的插入和删除操作都发生在同一端,即栈顶。本文将详细介绍如何实现栈的排序,并提供C, C#, C++三种语言的示例。

栈的基本操作

在介绍栈的排序之前,我们先回顾一下栈的基本操作:

  1. 初始化栈
  2. 入栈(push)
  3. 出栈(pop)
  4. 获取栈顶元素
  5. 判断栈是否为空

以下是C, C#, C++三种语言实现栈的基本操作的示例:

C语言

#include <stdio.h>
#include <stdlib.h>typedef struct Stack {int *data;int top;int maxSize;
} Stack;// 初始化栈
void initStack(Stack *s, int size) {s->data = (int *)malloc(size * sizeof(int));s->top = -1;s->maxSize = size;
}// 入栈
void push(Stack *s, int value) {if (s->top < s->maxSize - 1) {s->top++;s->data[s->top] = value;} else {printf("栈满,无法入栈!\n");}
}// 出栈
int pop(Stack *s) {if (s->top >= 0) {int value = s->data[s->top];s->top--;return value;} else {printf("栈空,无法出栈!\n");return -1;}
}// 获取栈顶元素
int getTop(Stack *s) {if (s->top >= 0) {return s->data[s->top];} else {printf("栈空!\n");return -1;}
}// 判断栈是否为空
int isEmpty(Stack *s) {return s->top == -1;
}

C#语言

using System;public class Stack {private int[] data;private int top;private int maxSize;public Stack(int size) {data = new int[size];top = -1;maxSize = size;}// 入栈public void Push(int value) {if (top < maxSize - 1) {top++;data[top] = value;} else {Console.WriteLine("栈满,无法入栈!");}}// 出栈public int Pop() {if (top >= 0) {int value = data[top];top--;return value;} else {Console.WriteLine("栈空,无法出栈!");return -1;}}// 获取栈顶元素public int GetTop() {if (top >= 0) {return data[top];} else {Console.WriteLine("栈空!");return -1;}}// 判断栈是否为空public bool IsEmpty() {return top == -1;}
}

C++语言

#include <iostream>
#include <vector>using namespace std;class Stack {
private:vector<int> data;int top;int maxSize;public:Stack(int size) : top(-1), maxSize(size) {}// 入栈void push(int value) {if (top < maxSize - 1) {top++;data.push_back(value);} else {cout << "栈满,无法入栈!" << endl;}}// 出栈int pop() {if (top >= 0) {int value = data[top];data.pop_back();top--;return value;} else {cout << "栈空,无法出栈!" << endl;return -1;}}// 获取栈顶元素int getTop() {if (top >= 0) {return data[top];} else {cout << "栈空!" << endl;return -1;}}// 判断栈是否为空bool isEmpty() {return top == -1;}
};

栈的排序

栈的排序是指将一个无序栈调整为有序栈。这里我们以升序排序为例,介绍两种常见的栈排序方法:递归法和辅助栈法。

递归法
递归法的基本思想是:每次递归地将栈顶元素出栈,然后对剩余的栈进行排序,最后将栈顶元素重新入栈。

以下是C, C#, C++三种语言实现递归法栈排序的代码示例:

C语言

void sortStack(Stack* stack) {if (!isEmpty(stack)) {int value = pop(stack);sortStack(stack);sortedInsert(stack, value);}
}void sortedInsert(Stack* stack, int value) {if (isEmpty(stack) || value > getTop(stack)) {push(stack, value);} else {int temp = pop(stack);sortedInsert(stack, value);push(stack, temp);}
}

C#语言

public void SortStack() {if (!IsEmpty()) {int value = Pop();SortStack();SortedInsert(value);}
}private void SortedInsert(int value) {if (IsEmpty() || value > GetTop()) {Push(value);} else {int temp = Pop();SortedInsert(value);Push(temp);}
}

C++语言

void sortStack() {if (!isEmpty()) {int value = pop();sortStack();sortedInsert(value);}
}void sortedInsert(int value) {if (isEmpty() || value > getTop()) {push(value);} else {int temp = pop();sortedInsert(value);push(temp);}
}

辅助栈法
辅助栈法的基本思想是:使用一个额外的栈来辅助排序。将原栈的元素逐个出栈,然后按照顺序插入到辅助栈中,最后将辅助栈的元素逐个出栈放回原栈。

以下是C, C#, C++三种语言实现辅助栈法栈排序的代码示例:

C语言

void sortStackUsingTempStack(Stack* stack) {Stack* tempStack = initStack();while (!isEmpty(stack)) {int temp = pop(stack);while (!isEmpty(tempStack) && getTop(tempStack) > temp) {push(stack, pop(tempStack));}push(tempStack, temp);}while (!isEmpty(tempStack)) {push(stack, pop(tempStack));}
}

C#语言

public void SortStackUsingTempStack() {Stack tempStack = new Stack();while (!IsEmpty()) {int temp = Pop();while (!tempStack.IsEmpty() && tempStack.GetTop() > temp) {Push(tempStack.Pop());}tempStack.Push(temp);}while (!tempStack.IsEmpty()) {Push(tempStack.Pop());}
}

C++语言

void sortStackUsingTempStack() {Stack tempStack;while (!isEmpty()) {int temp = pop();while (!tempStack.isEmpty() && tempStack.getTop() > temp) {push(tempStack.pop());}tempStack.push(temp);}while (!tempStack.isEmpty()) {push(tempStack.pop());}
}

总结

本文详细介绍了栈的排序方法,包括递归法和辅助栈法,并提供了C, C#, C++三种语言的示例。递归法利用递归将栈顶元素出栈,然后重新插入到正确的位置;辅助栈法则利用一个额外的栈来辅助排序。这两种方法都可以实现栈的排序,但辅助栈法在实际应用中更为常见,因为它避免了递归可能带来的栈溢出问题。

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

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

相关文章

【46 Pandas+Pyecharts | 当当网畅销图书榜单数据分析可视化】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 去除重复数据2.4 书名处理2.5 提取年份 &#x1f3f3;️‍&#x1f308; 3. Pyecharts数据可视化3.1 作者图书数量分布3.2 图书出版年份…

JVM--垃圾收集算法

1.分代收集理论 垃圾收集算法可以划分为“引用计数式垃圾收集”&#xff08;ReferenceCounting GC&#xff09;和“追踪式垃圾收集”&#xff08;Tracing GC&#xff09;两大类&#xff0c;本次仅仅讨论踪式垃圾收集 谈到垃圾收集 &#xff0c;首先先了解分代的收集理论&#x…

Nuxt.js头部魔法:轻松自定义页面元信息,提升用户体验

title: Nuxt.js头部魔法&#xff1a;轻松自定义页面元信息&#xff0c;提升用户体验 date: 2024/7/16 updated: 2024/7/16 author: cmdragon excerpt: 摘要&#xff1a;“Nuxt.js头部魔法&#xff1a;轻松自定义页面元信息&#xff0c;提升用户体验”介绍如何使用useHead函数…

mybatis的xml中,where标签不自动删除多余的and之类的问题

遇到了这个莫名其妙的问题&#xff0c;起初是很疑惑的&#xff0c;where标签好像失灵了一般不会自动删除掉 多余的and 看了眼sql语句&#xff0c;发现还是有and没被删除。 后来重新写了遍后发现又没事了。真的是神人。 然后就研究了好一会&#xff0c;发现&#xff01;&#…

Rust RefCell<T> 和内部可变性模式

内部可变性&#xff08;Interior mutability&#xff09;是 Rust 中的一个设计模式&#xff0c;它允许你即使在有不可变引用时也可以改变数据&#xff0c;这通常是借用规则所不允许的。为了改变数据&#xff0c;该模式在数据结构中使用 unsafe 代码来模糊 Rust 通常的可变性和借…

移动UI:具备什么特征,可以被认定为科技风格。

移动UI设计在科技风格上通常具备以下特征&#xff1a; 1. 清晰简洁的排版&#xff1a; 科技风格的移动UI通常采用清晰简洁的排版&#xff0c;注重信息的层次感和结构化&#xff0c;以便用户能够快速、直观地获取所需信息。 2. 几何形状和线条&#xff1a; 科技风格的移动UI常…

【算法】代码随想录之哈希表(更新中)

文章目录 前言 一、有效的字母异位词&#xff08;LeetCode--242&#xff09; 二、两个数组的交集&#xff08;LeetCode--349&#xff09; 前言 跟随代码随想录&#xff0c;学习哈希表相关的算法题目&#xff0c;记录学习过程中的tips。 一、有效的字母异位词&#xff08;Le…

更新:彩虹云商城系统 自助下单免授权无后门源码(修复完整版)

源码简介&#xff1a; 最新更新彩虹云商城系统&#xff0c;自助下单免授权无后门源码&#xff08;修复完整版&#xff09; 自助下单彩虹云商城系统。这玩意儿不简单&#xff0c;它是高效稳定的电商平台&#xff01;免授权源码版本&#xff0c;灵活方便。源码是用PHP语言写的。…

迅为3A5000_7A2000ATX标准DIY国产龙芯电脑

性能强 采用全国产龙芯3A5000处理器&#xff0c;基于龙芯自主指令系统 (LoongArch)的LA464微结构&#xff0c;并进一步提升频率&#xff0c;降低功耗&#xff0c;优化性能。 桥片 采用龙芯 7A2000&#xff0c;支持PCIE 3.0、USB 3.0和 SATA 3.0.显示接口2 路、HDMI 和1路 VGA&a…

超算网络体系架构-资源层-平台层-服务层-应用层

目录 超算网络体系架构 我国超算基础设施 超算互联网相关标准研制方面 技术架构 资源层 基础资源 芯片多样 体系异构 高效存储 高速互连 资源池化 可隔离 可计量 互联网络 高带宽 低时延 高安全 平台层 算力接入 资源管理 算力调度 用户管理 交易管理 模…

【linux】报错解决:配置RAIDA1之后系统识别不到

【linux】报错解决&#xff1a;配置RAIDA1之后系统识别不到 一、问题描述&#xff1a; 我的主板是华南金牌X99-F8D PLUS&#xff0c;安装了ubuntu20.04&#xff0c;通过BIOS创建了RAID1数组&#xff0c;进入系统之后识别不到我创建的RAID1数组。 二、原因分析&#xff1a; 可…

MySQL基础查询(DQL)

在查询之前&#xff0c;先看一下我的表内容和数据,一下都是参照我的表的数据来做个样例。我这个表名我自己起为emp 1.查询多个字段 &#xff08;1&#xff09;这个也就是可以随机想查自己想要的字段&#xff0c;可以是全部 SELECT 字段1,字段2,字段3..... FROM 表名例如我想…

Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码

章节内容 上节我们完成了&#xff1a; ZooKeeper的Leader选举机制ZooKeeper的选举过程ZooKeeper的ZAB协议 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学习。 之前已经在 VM 虚拟机上搭建过一次&#xff0…

【Linux】多线程_9

文章目录 九、多线程10. 线程池 未完待续 九、多线程 10. 线程池 这里我没实现一些 懒汉单例模式 的线程池&#xff0c;并且包含 日志打印 的线程池&#xff1a; Makefile&#xff1a; threadpool:Main.ccg -o $ $^ -stdc11 -lpthread .PHONY:clean clean:rm -f threadpoolT…

element ui中el-form-item的属性rules的用法

目录 el-form-item的属性rules的用法 栗子 总结 实践应用 一、 定义静态的校验规则 二、定义动态的校验规则 el-form-item的属性rules的用法 在学习element ui 的Form表单组件时&#xff0c;学到el-form-item也有rules属性&#xff0c;但是对应这个属性如何使用&#x…

Databend 开源周报第 153 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend。 支持必须更改密码…

Adobe Photoshop 2024 25.9.1 Win/Mac PS2024最新中文学习版

Adobe Photoshop 2024&#xff0c;简称PS&#xff0c;目前最强的图片处理合成软件,PS提供了广泛的工具和功能&#xff0c;包括画笔、铅笔、颜色替换、混合器画笔等绘画工具&#xff0c;以及裁剪、透视变形、智能修复画笔等编辑工具。用户可以使用这些工具进行图片编辑、合成、校…

旅游数据可视化:免费工具让复杂数据变得简单易懂

随着旅游业的蓬勃发展&#xff0c;海量的数据如同繁星点点&#xff0c;记录着每一位旅者的足迹与偏好。然而&#xff0c;如何将这些复杂的数据转化为直观、易懂的信息&#xff0c;为旅游企业精准决策、为消费者提供更加个性化的服务&#xff0c;成为了行业内外共同关注的焦点。…

vue2+antd实现表格合并;excel效果

效果图 一、html <template><div><a-table :columns"columns" :dataSource"dataSource" rowKey"id" :pagination"false" bordered><template slot"content1" slot-scope"text">{{text}}…

JuiceFS缓存特性

缓存 对于一个由对象存储和数据库组合驱动的文件系统&#xff0c;缓存是本地客户端与远端服务之间高效交互的重要纽带。读写的数据可以提前或者异步载入缓存&#xff0c;再由客户端在后台与远端服务交互执行异步上传或预取数据。相比直接与远端服务交互&#xff0c;采用缓存技…