C语言基础(二十五)

news2025/1/23 2:15:03

栈排序不是最高效的方法,因为栈是一种后进先出(LIFO, Last In First Out)的数据结构,而排序要求根据元素的顺序(如升序或降序)重新排列。但是,可以利用栈的特性,结合其他排序算法的思想,或者通过多次入栈和出栈操作间接实现排序。

测试代码:

#include "date.h"
#include <stdio.h>  
#include <stdlib.h>  
  
typedef int ElementType;  
  
typedef struct Node {  
    ElementType data;  
    struct Node* next;  
} Node;  
  
typedef struct {  
    Node* top;  
} Stack;  
  
// 初始化栈  
void InitStack(Stack* s) {  
    s->top = NULL;  
}  
  
// 检查栈是否为空  
int IsEmpty(Stack* s) {  
    return s->top == NULL;  
}  
  
// 入栈  
void Push(Stack* s, ElementType e) {  
    Node* newNode = (Node*)malloc(sizeof(Node));  
    if (!newNode) {  
        printf("Memory allocation failed.\n");  
        return;  
    }  
    newNode->data = e;  
    newNode->next = s->top;  
    s->top = newNode;  
}  
  
// 出栈  
ElementType Pop(Stack* s) {  
    if (IsEmpty(s)) {  
        printf("Stack is empty. Cannot pop.\n");  
        return -1; // 假设-1是错误值  
    }  
    Node* temp = s->top;  
    ElementType popped = temp->data;  
    s->top = s->top->next;  
    free(temp);  
    return popped;  
}  
  
// 计算栈中元素数量  
int CountElements(Stack* s) {  
    int count = 0;  
    Node* current = s->top;  
    while (current != NULL) {  
        count++;  
        current = current->next;  
    }  
    return count;  
}  
  
// 打印栈  
void PrintStack(Stack* s) {  
    Node* current = s->top;  
    while (current != NULL) {  
        printf("%d ", current->data);  
        current = current->next;  
    }  
    printf("\n");  
}  
  
// 排序并重新入栈(使用插入排序)  
void SortAndPushBack(Stack* s) {  
    int count = CountElements(s);  
    ElementType* array = (ElementType*)malloc(sizeof(ElementType) * count);  
    if (!array) return;  
  
    int i = 0;  
    Node* current = s->top;  
    while (current != NULL) {  
        array[i++] = current->data;  
        current = current->next;  
    }  
  
    // 插入排序  
    for (int j = 1; j < count; j++) {  
        ElementType key = array[j];  
        int k = j - 1;  
  
        while (k >= 0 && array[k] > key) {  
            array[k + 1] = array[k];  
            k = k - 1;  
        }  
        array[k + 1] = key;  
    }  
  
    // 清空栈并重新入栈  
    InitStack(s);  
    for (int j = 0; j < count; j++) {  
        Push(s, array[j]);  
    }  
  
    free(array);  
}  
  
int main() {  
    int time = getTime();
    Stack s;  
    InitStack(&s);  
  
    Push(&s, 3);  
    Push(&s, 1);  
    Push(&s, 4);  
    Push(&s, 6);  
    Push(&s, 5);  
  
    printf("Original stack: ");  
    PrintStack(&s);  
    
    SortAndPushBack(&s); 
	printf("Sorted stack: ");  
    PrintStack(&s);
    // 出栈  
    printf("Popping: ");  
    while (!IsEmpty(&s)) {  
        printf("%d ", Pop(&s));  
    }  
    printf("\n");  
    return 0;  
}

运行结果如下:

 

...........................................................................................................................................................

队列(Queue)是一种先进先出(FIFO, First In First Out)的数据结构。队列的尾部用于添加元素(入队),而队列的头部用于移除元素(出队)。实现队列的方法有很多种,一般基于数组和链表实现。

测试代码;

#include "date.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define MAX_SIZE 10  // 定义队列的最大容量

typedef struct {
    int items[MAX_SIZE];
    int front;
    int rear;
} Queue;

// 初始化队列
void initQueue(Queue *q) {
    q->front = q->rear = -1;
}

// 检查队列是否满
bool isFull(Queue *q) {
    return q->rear == MAX_SIZE - 1;
}

// 检查队列是否为空
bool isEmpty(Queue *q) {
    return q->front == -1;
}

// 入队操作
bool enqueue(Queue *q, int element) {
    if (isFull(q)) {
        printf("Queue is full!\n");
        return false;
    }
    if (isEmpty(q)) {
        q->front = 0;
    }
    q->rear++;
    q->items[q->rear] = element;
    printf("Enqueued %d to queue\n", element);
    return true;
}

// 出队操作
bool dequeue(Queue *q, int *element) {
    if (isEmpty(q)) {
        printf("Queue is empty!\n");
        return false;
    }
    *element = q->items[q->front];
    q->front++;
    if (q->front > q->rear) { // 若队列为空,重置front和rear
        q->front = q->rear = -1;
    }
    return true;
}

// 打印队列元素
void printQueue(Queue q) {
    if (isEmpty(&q)) {
        printf("Queue is empty\n");
        return;
    }

    printf("Queue elements:\n");
    for (int i = q.front; i <= q.rear; i++) {
        printf("%d ", q.items[i]);
    }
    printf("\n");
}

int main() {
	int time = getTime();
    Queue q;
    initQueue(&q);

    // 入队操作
    enqueue(&q, 6);
    enqueue(&q, 2);
    enqueue(&q, 18);
    enqueue(&q, 0);
    enqueue(&q, 3);

    // 出队操作  
    int element;
    while (dequeue(&q, &element)) {  
        printf("Element dequeued: %d\n", element);  
   }  
    // 再次入队  
    enqueue(&q, 4);  
    enqueue(&q, 5);
    enqueue(&q, 10);
    enqueue(&q, 1);
    // 打印队列元素  
    printQueue(q);

    return 0;
}

运行结果如下:

 

 

 

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

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

相关文章

group by 中一定要包含 select 中的 除聚合函数以外 的 所有字段

今天在项目过程中报错&#xff1a; ### SQL: SELECT UNIT_NAME,dc.CAPTION as area,ifnull(a.bgSum,0) AS bgSum,ifnull(concat(FORMAT(a.bgSum/k.m*100,1),%),0.0%) as bgRatio FROM inspection_station_info isi left join dic_content dc on dc.CODE_VALUE…

K 线图快速绘制教程:使用 KLineChart 展示 DolphinDB K 线

KLineChart 是一款开源、简单易用、适用场景丰富的 Web 前端金融图表&#xff0c;基于 html5 canvas 构建&#xff0c;零依赖压缩包仅 40K&#xff0c;非常轻量。它可以用于渲染金融 K 线图&#xff0c;同时支持多种数据源&#xff0c;提供了丰富的交互功能以及指标计算接口。由…

动物消消乐:Scratch消除类游戏作品

小虎鲸Scratch资源站-免费Scratch作品源码,素材,教程分享平台! 体验《动物消消乐》&#xff0c;开启欢乐消除之旅&#xff01; 在这个快节奏的时代&#xff0c;放松心情、享受乐趣显得尤为重要。小虎鲸Scratch资源站为您带来了全新的游戏体验——《动物消消乐》。这款游戏不仅…

【CTF Web】BUUCTF Upload-Labs-Linux Pass-01 Writeup(JS分析+代码审计+文件上传)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的&#xff0c;专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关&#xff0c;每一关都包含着不同上传方式。 注意 1.每一关没有固定的…

上班摸鱼的人怎么治理?只要5个步骤让员工服服帖帖,打造干净职场

在职场中&#xff0c;我们时常会遇到一些同事在上班时间“摸鱼”&#xff0c;比如浏览与工作无关的网站、玩游戏、聊天等。这些行为不仅影响了工作效率&#xff0c;还可能损害团队的整体氛围和企业的利益。那么&#xff0c;如何有效地治理这种“摸鱼”现象呢&#xff1f;今天&a…

鸿蒙ArkTS小案例-购物车

最近用鸿蒙的ArkTS做了一个购物车的小案例&#xff0c;在这里分享一下&#xff0c;该购物车已实现如下功能&#xff1a; 1. 购物车商品数量支持1个或者多个 2. 勾选1个或者多个商品后&#xff0c;底部可以动态计算出购买总数量和总价格 3. 同时&#xff0c;可以对购买商品的…

SpringBoot对接Midjourney Api

提示&#xff1a;SpringBoot对接Midjourney Api 文章目录 目录 文章目录 后端代码 导包 controller层 工具类层 前端代码 申请API 测试结果 后端代码 导包 <!--添加hutool的依赖--><dependency><groupId>cn.hutool</groupId><artifactId&g…

IoT客户端+联邦学习微调大模型

大型模型的训练涉及到微调&#xff0c;微调则面临着高质量数据的稀缺性。与基于集中式数据中心的解决方案相比&#xff0c;物联网-IoT中大型模型的更新面临着分布式客户端私有且异构数据的协调挑战。为了解决这一挑战&#xff0c;作者提出了KOALA来推动物联网中大模型的训练。由…

单线程Redis:Redis为什么这么快

1 Redis是不是单线程 Redis 使用后台线程执行耗时的 I/O 操作&#xff0c;以免阻塞主线程 bio_close_file&#xff1a;后台 I/O 线程之一&#xff0c;异步关闭文件 bio_aof_fsync&#xff1a;后台 I/O 线程之一&#xff0c;异步地将 AOF&#xff08;Append Only File&#xff…

C++系列-STL容器之vector

STL概念 vector基本概念vector与数组的区别vector容器的特点动态大小连续存储自动扩容尾部操作高效 vector动态扩展的含义vector常用的接口示意 vector的构造函数vector赋值操作重载赋值assign赋值 vector的容量和大小vector的插入和删除vector数据存取vector互换容器vector互换…

音视频入门基础:WAV专题(7)——FFmpeg源码中计算WAV音频文件每个packet的size值的实现

一、引言 从文章《音视频入门基础&#xff1a;WAV专题&#xff08;6&#xff09;——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道&#xff0c;通过FFprobe命令可以显示WAV音频文件每个packet&#xff08;也称为数据包或多媒体包&#xff09;的信息&#xff0…

VMware16安装包+详细安装教程

VMware Workstation Pro16.0安装 安装包下载&#xff1a; 通过百度网盘分享的文件&#xff1a;VMware16.0.rar 链接&#xff1a;https://pan.baidu.com/s/1ZSWns5kJYUmhpZFjuKXqrQ?pwdv7s2 提取码&#xff1a;v7s2右键解压之后的安装包【VMware-workstation-full-16.0.0-16…

FrameNet介绍——从同义词语义知识库到框架语义知识库

FrameNet 是一个为期三年的项目&#xff0c;获得了 NSF&#xff08;美国国家科学基金会&#xff09;的支持&#xff0c;专注于基于语料库的计算词典编纂。 项目特点 FrameNet承诺使用语料库证据&#xff08;corpus evidence&#xff09;来进行语义和句法的概括&#xff1b; 并…

网络基础-实现在Windows系统下的socket环境地址通信

实现客户端和服务端的数据交互 1.写所要实现功能的声明&#xff08;封装在tcpsocket.h文件&#xff09; #ifndef TCPSOCKET_H #define TCPSOCKET_H//在Windows下进行网络编程&#xff0c;需要引入Windows的socket库 #include <winsock2.h> //做一些预编译工作&#xff…

MyBatis结果集复杂映射超详细版(一对多关系映射)

目录 1.一对多关系映射 1.1创建两个表&#xff1a;goods表与goods_class表 1.2xml文件中两部分&#xff1a;与(存放SQL语句)1.3数据库中&#xff1a;测试SQL语句&#xff0c;涉及到的知识点&#xff1a;左连接 1.一对多关系映射 1.1创建两个表&#xff1a;goods表与goods_c…

C++对C的扩充(8.28)

1.使用C手动封装一个顺序表&#xff0c;包括成员数组1个&#xff0c;成员变量n个 代码&#xff1a; #include <iostream>using namespace std;//类型重命名 using datatype int; #define MAX 30struct seqList { private: //私有权限datatype *data; //相当于 …

【项目源码】终于有人将打字游戏和编程英语结合起来啦!编程初学者的福音

Hello&#xff01;各位彦祖&#xff0c;亦菲们&#xff01;又是美好的一天&#xff01;今天给大家分享一个Java项目源码&#xff1a;Java打字游戏项目源码&#xff01; 看到这里&#xff0c;你可能会说&#xff01; 一个破打字游戏有什么可神气的&#xff01;&#xff01;&…

【自由能系列(中级)】状态与动作的协同机制解析 ——从马尔可夫毯到大脑功能的全方位剖析

状态与动作的协同机制解析 ——从马尔可夫毯到大脑功能的全方位剖析 Synergistic Mechanism of States and Actions —— A Comprehensive Analysis from Markov Blanket to Brain Function 核心结论&#xff1a; 中文总结&#xff1a; 系统将状态划分为内部状态和隐藏或外…

Flutter中的Key

在Flutter 中&#xff0c;Key 是 几乎所有 widget 都具有的属性。为什么 widget 具有 Key 呢&#xff1f;Key的作用是什么&#xff1f; 什么是 Key Key是Widget、Element 和 SemanticNodes 的标识符。 Key 是Widget、Element 和 SemanticNodes的唯一标识。例如对于 Widget 在 …

MyBatis的学习————下篇

目录 一、动态SQL 简介 1、if标签 2、where标签 3、trim标签 4、choose、when、otherwise 5、foreach 5.1、批量删除 5.2、批量添加 6、sql标签 二、MyBatis的缓存 1、一级缓存 2、二级缓存 3、二级缓存的相关配置 4、MyBatis缓存查询的顺序 5、 第三方缓存EHCac…