数据结构之栈的实现与排序详解与示例(C, C#, C++)
创始人
2025-01-10 01:03:36
0

文章目录

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

在这里插入图片描述


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

栈的基本操作

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

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

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

C语言

#include  #include   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  #include   using namespace std;  class Stack { private:     vector 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++三种语言的示例。递归法利用递归将栈顶元素出栈,然后重新插入到正确的位置;辅助栈法则利用一个额外的栈来辅助排序。这两种方法都可以实现栈的排序,但辅助栈法在实际应用中更为常见,因为它避免了递归可能带来的栈溢出问题。

相关内容

热门资讯

5分钟自建房!如何判断wpk辅... 5分钟自建房!如何判断wpk辅助软件的真假(辅助挂),wEpoKer辅助透视下载,解密教程(有挂透明...
记者揭秘助手!亲朋游戏有辅助器... 记者揭秘助手!亲朋游戏有辅助器(辅助挂)原来存在有挂的(2024已更新)(哔哩哔哩);1、超多福利:...
信息共享"aapok... 信息共享"aapoker辅助软件(wEpoke)外挂透明挂辅助工具",解密教程(2025已更新)(哔...
玩家实测!阿拉斗牛有规律,gg... 玩家实测!阿拉斗牛有规律,gg扑克有假,详细教程(有挂同胞)-哔哩哔哩是一款可以让一直输的玩家,快速...
6分钟存在!wepoker科技... 6分钟存在!wepoker科技辅助器(透视器),wepoker透视器神器,AA德州教程(有挂揭秘)是...
七分钟透明挂!德州ai智能辅助... 您好,wpk代打这款游戏可以开挂的,确实是有挂的,需要了解加微【485275054】很多玩家在这款游...
技巧知识分享工具!桂林字牌辅助... 技巧知识分享工具!桂林字牌辅助工具视频(辅助挂)原来真的有猫腻(2023已更新)(哔哩哔哩);桂林字...
揭秘真相!丰城瓜瓜棋牌有挂,微... 揭秘真相!丰城瓜瓜棋牌有挂,微扑克发牌机制,详细教程(有挂讨论)-哔哩哔哩;AI辅助机器人普及解说快...
8分钟ai代打!wepoker... 8分钟ai代打!wepoker获得好牌(透视辅助),wePOker透视器软件,靠谱教程(有挂力荐)是...
我来向大家传授"微扑... 我来向大家传授"微扑克专用辅助器(Wepoke测试)外挂透明挂辅助工具",教你教程(2022已更新)...