当前位置: 首页 > news >正文

数据结构之栈的实现与排序详解与示例(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++三种语言的示例。递归法利用递归将栈顶元素出栈,然后重新插入到正确的位置;辅助栈法则利用一个额外的栈来辅助排序。这两种方法都可以实现栈的排序,但辅助栈法在实际应用中更为常见,因为它避免了递归可能带来的栈溢出问题。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • java基础学习:序列化之 - ObjectMapper
  • 蒙特卡洛采样
  • 【单元测试】SpringBoot
  • PHP恋爱话术微信小程序系统源码
  • go面试题 Day3
  • 每天一个数据分析题(四百三十一)- 卡方检验
  • 关键字 internal
  • mac安装win10到外接固态硬盘
  • Android12 MultiMedia框架之NuPlayer Surface
  • Redis⑥ —— 缓存设计
  • 在日常生活中,应该如何保护自己的网络安全
  • HDFS和FDFS
  • docker 数据管理和网络通信
  • C++基础(一)
  • 鹈鹕优化算法(POA)及其Python和MATLAB实现
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 10个确保微服务与容器安全的最佳实践
  • IP路由与转发
  • Javascript弹出层-初探
  • mysql 数据库四种事务隔离级别
  • MySQL几个简单SQL的优化
  • mysql中InnoDB引擎中页的概念
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Shell编程
  • TCP拥塞控制
  • ubuntu 下nginx安装 并支持https协议
  • 关于Flux,Vuex,Redux的思考
  • 记录一下第一次使用npm
  • 技术:超级实用的电脑小技巧
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 微信小程序:实现悬浮返回和分享按钮
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (2.2w字)前端单元测试之Jest详解篇
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (pytorch进阶之路)扩散概率模型
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (理论篇)httpmoudle和httphandler一览
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .bat批处理出现中文乱码的情况
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .Net Core与存储过程(一)
  • .NET Micro Framework初体验(二)
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net mvc部分视图