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

相关内容

热门资讯

攻略辅助!新九天作弊系统(辅助... 攻略辅助!新九天作弊系统(辅助)原来一直总是有辅助攻略(哔哩哔哩)进入游戏-大厅左侧-新手福利-激活...
黑科技辅助挂!超级三加一辅助工... 黑科技辅助挂!超级三加一辅助工具!总是是有开挂辅助教程(今日头条)-哔哩哔哩黑科技辅助挂!超级三加一...
绝活辅助!新蜜瓜大厅破解(辅助... 绝活辅助!新蜜瓜大厅破解(辅助)确实是有辅助软件(哔哩哔哩)暗藏猫腻,小编详细说明新蜜瓜大厅破解破解...
黑科技插件!丽水都莱辅助工具试... 您好,丽水都莱辅助工具试用这款游戏可以开挂的,确实是有挂的,需要了解加去威信【136704302】很...
据权威媒体报道!pokemmo... 据权威媒体报道!pokemmo辅助器手机版下载!确实确实有开挂辅助教程(详细教程)-哔哩哔哩1.po...
攻略辅助!逍遥辅助下载地址(辅... 攻略辅助!逍遥辅助下载地址(辅助)原来是真的有辅助方法(哔哩哔哩)1、下载好逍遥辅助下载地址正确养号...
2026版教程!海盗来了辅助哪... 2026版教程!海盗来了辅助哪个好!都是是有开挂辅助挂(有挂技术)-哔哩哔哩1、海盗来了辅助哪个好免...
攻略辅助!情怀游戏辅助器(辅助... 攻略辅助!情怀游戏辅助器(辅助)一贯真的有辅助插件(哔哩哔哩)1、实时情怀游戏辅助器透视辅助更新:用...
演示辅助!蘑菇云辅助(辅助)果... 演示辅助!蘑菇云辅助(辅助)果然存在有辅助攻略(哔哩哔哩)1、该软件可以轻松地帮助玩家将蘑菇云辅助辅...
今天下午!福建大玩家辅助器!总... 今天下午!福建大玩家辅助器!总是存在有开挂辅助神器(有挂秘籍)-哔哩哔哩1、今天下午!福建大玩家辅助...