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

相关内容

热门资讯

透视讲解!wepoker辅助软... 透视讲解!wepoker辅助软件价格(透视)wepoker能不能透视(切实真的有挂)wepoker辅...
透视计算!德州透视脚本(透视)... 透视计算!德州透视脚本(透视)黑科技教程(2020已更新)(哔哩哔哩)1、用户打开应用后不用登录就可...
透视苹果版!wepoker透视... 透视苹果版!wepoker透视脚本(透视)辅助是真的假的(原来是有挂)1、点击下载安装,wepoke...
透视插件!wepokerplu... 透视插件!wepokerplus脚本(透视)wepoker是不是有人用挂(都是有挂)1、wepoke...
透视挂!pokermaster... 透视挂!pokermaster脚本(透视)必胜教程(2022已更新)(哔哩哔哩);1、pokerma...
透视ai代打!wepoker透... 透视ai代打!wepoker透视脚本免费使用视频(透视)辅助透视软件(一直真的是有挂)1、首先打开w...
透视脚本!WePoKer辅助器... 透视脚本!WePoKer辅助器(透视)wepoker脚本下载(竟然是有挂)1、下载好wepoker脚...
透视好友!wepoker有没有... 透视好友!wepoker有没有机器人(透视)有机器人(都是有挂)1、让任何用户在无需wepoker有...
透视存在!哈糖大菠萝有挂吗(透... 透视存在!哈糖大菠萝有挂吗(透视)可靠技巧(2023已更新)(哔哩哔哩);哈糖大菠萝有挂吗辅助器中分...
透视ai!wepokerplu... 透视ai!wepokerplus到底是挂了吗(透视)wepoker私人局透视教程(总是存在有挂);1...