数据结构(1~10)

(1)双栈

#include <iostream>
#include <algorithm>
using namespace std;
// 定义栈元素的类型
typedef int SElemType;// 定义双栈数据结构
typedef struct {int top[2];int bot[2];SElemType *V;int m;
} DblStack;// 初始化双栈
void InitDblStack(DblStack *S, int maxSize) {S->m = maxSize;S->V = new SElemType[maxSize]; // 使用 new 替代 mallocS->bot[0] = -1;S->top[0] = -1; // 0号栈为空S->bot[1] = maxSize;S->top[1] = maxSize; // 1号栈为空
}// 判断0号栈是否为空
bool StackEmpty0(DblStack *S) {return S->top[0] == -1;
}// 判断1号栈是否为空
bool StackEmpty1(DblStack *S) {return S->top[1] == S->m;
}// 判断双栈是否已满
bool StackFull(DblStack *S) {return S->top[0] + 1 == S->top[1];
}// 0号栈进栈操作
bool Push0(DblStack *S, SElemType e) {if (StackFull(S)) {std::cout << "栈溢出!" <<endl;return false;}S->V[++(S->top[0])] = e;return true;
}// 1号栈进栈操作
bool Push1(DblStack *S, SElemType e) {if (StackFull(S)) {cout << "栈溢出!" << endl;return false;}S->V[--(S->top[1])] = e;return true;
}// 0号栈出栈操作
bool Pop0(DblStack *S, SElemType *e) {if (StackEmpty0(S)) {cout << "栈下溢!" << endl;return false;}*e = S->V[(S->top[0])--];return true;
}// 1号栈出栈操作
bool Pop1(DblStack *S, SElemType *e) {if (StackEmpty1(S)) {cout << "栈下溢!" << endl;return false;}*e = S->V[(S->top[1])--];return true;
}// 打印栈数组
void PrintStack(DblStack *S) {cout << "栈数组: ";for (int i = 0; i < S->m; i++) {std::cout << S->V[i] << " ";}cout << "\n栈顶索引: 0: " << S->top[0] << ", 1: " << S->top[1] << endl;
}int main() {DblStack S;int maxSize = 10;InitDblStack(&S, maxSize);// 测试0号栈Push0(&S, 1);Push0(&S, 2);Push0(&S, 3);int e;Pop0(&S, &e);cout << "从0号栈弹出: " << e << endl;// 测试1号栈Push1(&S, 7);Push1(&S, 8);Push1(&S, 9);Pop1(&S, &e);cout << "从1号栈弹出: " << e << endl;// 打印栈数组PrintStack(&S);// 释放内存delete[] S.V; return 0;
}

(2)回文数

#include <iostream>
#include<string> 
#include<algorithm>
using namespace std;
int main() 
{string s;cin >> s;string oris = s;reverse(s.begin(),s.end());if(oris == s)cout <<"YES"<< endl;elsecout << "NO" << endl; return 0;
}

(3)设从键盘输入一整数的序列:a1,a2,a3,...,an,用栈结构存储输入的整数,当ai不等于-1时,将ai进栈;当ai=-1时,输出栈顶整数并出栈

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>const int  MAX_SIZE = 100 ;typedef struct {int data[MAX_SIZE]; // 存储栈中元素的数组int top; // 栈顶位置
} Stack;// 初始化栈
void initStack(Stack *s) {s->top = -1; // 栈顶位置初始化为-1,表示栈为空
}// 判断栈是否为空
bool isEmpty(Stack *s) {return s->top == -1;
}// 判断栈是否满
bool isFull(Stack *s) {return s->top == MAX_SIZE - 1;
}// 压栈操作
bool push(Stack *s, int value) {if (isFull(s)) {printf("栈满,无法压栈!\n");return false;}s->data[++(s->top)] = value; // 先增加栈顶位置,再赋值return true;
}// 弹栈操作
bool pop(Stack *s, int *value) {if (isEmpty(s)) {printf("栈空,无法弹栈!\n");return false;}*value = s->data[(s->top)--]; return true;
}// 获取栈顶元素
bool top(Stack *s, int *value) {if (isEmpty(s)) {printf("栈空,无法获取栈顶元素!\n");return false;}*value = s->data[s->top];return true;
}int main() {Stack s;initStack(&s);int input;printf("请输入一整数的序列,以-1表示输出栈顶并出栈:\n");while (scanf("%d", &input) != EOF) {if (input != -1) {if (!push(&s, input)) {break; }} else {int value;if (top(&s, &value) && pop(&s, &value)) {printf("栈顶整数:%d\n", value);}}}return 0;
}

(4)从键盘上输入一个后缀表达式,规定:后缀表达式长度不超过一行,以’$'结束操作数之间用空格分割。且操作符只有 + - * / 四种。
后缀表达式:234 34 + 2 *$

#include <iostream>
#include <stack>
#include <sstream>
#include <string>
#include <cctype>using namespace std;// 函数:判断一个字符串是否是有效的操作符
bool isOperator(const string& token) {return token == "+" || token == "-" || token == "*" || token == "/";
}// 函数:将字符串转换为整数
int stringToInt(const string& str) {return stoi(str);
}// 函数:计算两个操作数的结果,根据给定的操作符
int applyOperator(const string& op, int a, int b) {if (op == "+") return a + b;if (op == "-") return a - b;if (op == "*") return a * b;if (op == "/") {if (b == 0) {cerr << "Error: Division by zero!" << endl;exit(EXIT_FAILURE); // 处理除以零的错误情况}return a / b;}return 0; 
}int main() {stack<int> values; // 用于存储操作数的栈string line;getline(cin, line, '$'); // 从键盘读取一行输入,直到遇到'$'字符istringstream iss(line); // 使用输入字符串流来解析输入string token;while (iss >> token) { if (isOperator(token)){ // 如果token是操作符int b = values.top(); values.pop(); int a = values.top(); values.pop(); int result = applyOperator(token, a, b); // 计算结果values.push(result); // 将结果压入栈中}else { values.push(stringToInt(token)); // 将操作数转换为整数并压入栈中}}// 栈中应该只剩下一个元素,即表达式的最终结果if (!values.empty()) {cout << "计算结果: " << values.top() << endl;} else {cerr << "错误:后缀表达式计算结果导致了一个空堆栈! " << endl;}return 0;
}

(5)假设以I和O分别表示入栈和出栈操作。

#include <iostream>
#include <string>using namespace std;//检查给定的IO序列是否为合法序列
bool isValidSequence(const string& sequence) 
{int balance = 0; // 用于跟踪栈的平衡状态for (char ch : sequence) {if (ch == 'I'){balance++; // 入栈操作,增加平衡计数}else if (ch == 'O') {if (balance == 0) {// 出栈操作,但栈为空,因此序列非法return false;}balance--; // 出栈操作,减少平衡计数} else {// 序列中包含非法字符return false;}}return balance == 0;
}int main() {string sequence;cout << "请输入一个由I和O组成的序列:";cin >> sequence;if (isValidSequence(sequence)) {cout << "序列是合法的。" << endl;} else {cout << "序列是非法的。" << endl;}return 0;
}

(6)假设以带头结点的循环链表表示队列

#include <stdio.h>
#include <stdlib.h>// 定义链表结点结构
typedef struct Node {int data;struct Node* next;
} Node;// 定义队列结构,包含一个指向队尾元素的指针
typedef struct {Node* tail; 
} CircularQueue;// 初始化队列
void initQueue(CircularQueue* q) 
{// 创建一个头结点,它同时也是尾结点的前驱q->tail = (Node*)malloc(sizeof(Node));if (q->tail == NULL) {printf("内存分配失败 ");exit(1);}q->tail->data = 0; q->tail->next = q->tail; 
}// 入队列操作
void enqueue(CircularQueue* q, int value) 
{Node* newNode = (Node*)malloc(sizeof(Node));if (newNode == NULL) {printf("内存分配失败 ");exit(1);}newNode->data = value;newNode->next = q->tail->next;q->tail->next = newNode;q->tail = newNode; 
}// 出队列操作,返回队首元素的值,并移除该元素
int dequeue(CircularQueue* q) 
{if (q->tail->next == q->tail) {printf("栈是空的");exit(1); }Node* temp = q->tail->next;int value = temp->data; q->tail->next = temp->next; free(temp); // 释放队首元素的内存return value;
}// 打印队列中的所有元素(用于调试)
void printQueue(CircularQueue* q) {if (q->tail->next == q->tail) {printf("Queue is empty\n");return;}Node* current = q->tail->next;while (current != q->tail) {printf("%d ", current->data);current = current->next;}printf("\n");
}// 主函数用于测试队列操作
int main() {CircularQueue q;initQueue(&q);enqueue(&q, 1);enqueue(&q, 2);enqueue(&q, 3);printQueue(&q); // 输出: 1 2 3printf("队列: %d\n", dequeue(&q)); printQueue(&q); // 输出: 2 3return 0;
}

(7)假设以数组q[m]存放

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>#define M 5 // 队列的最大容量typedef struct {int Q[M]; // 队列元素数组int front; // 队头指针int rear; // 队尾指针int tag; // 队列状态标志,0表示空,1表示满,-1表示初始状态(可选,用于更明确的初始化检查)
} CircularQueue;// 初始化队列
void initQueue(CircularQueue* q) {q->front = 0;q->rear = 0;q->tag = -1; 
}// 判断队列是否为空
bool isEmpty(CircularQueue* q) {return q->tag == 0 && q->front == q->rear;
}// 判断队列是否已满
bool isFull(CircularQueue* q) {return q->tag == 1 || ((q->rear + 1) % M == q->front);
}// 入队列操作
bool enqueue(CircularQueue* q, int value) {if (isFull(q)) {printf("队列已满,无法入队\n");return false;}if (q->tag == -1) {q->tag = 0; // 如果队列处于初始状态,则将其设置为空状态}q->Q[q->rear] = value;q->rear = (q->rear + 1) % M;if (q->rear == q->front) { if (!isEmpty(q)) { q->tag = 1;}}return true;
}// 出队列操作
bool dequeue(CircularQueue* q, int* value) {if (isEmpty(q)) {printf("队列为空,无法出队\n");return false;}*value = q->Q[q->front];q->front = (q->front + 1) % M;if (q->front == q->rear) { // 出队后front追上了rear,队列变为空q->tag = 0;} else {q->tag = -1;}return true;
}int main() {CircularQueue q;initQueue(&q);// 测试入队列操作enqueue(&q, 1);enqueue(&q, 2);enqueue(&q, 3);enqueue(&q, 4);enqueue(&q, 5); // 此时队列应已满// 测试出队列操作int value;dequeue(&q, &value);printf("出队元素: %d\n", value);dequeue(&q, &value);printf("出队元素: %d\n", value);// 再次测试入队列操作,检查队列是否能正确循环enqueue(&q, 6);printf("入队元素: 6\n");// 检查队列状态if (isEmpty(&q)) {printf("队列为空\n");} else if (isFull(&q)) {printf("队列已满\n");} else {printf("队列既不满也不空\n");}return 0;
}

(8)如果允许在循环队列的

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>#define M 5 // 队列的最大容量typedef struct {int Q[M]; // 队列元素数组int front; // 队头指针int rear; // 队尾指针(指向下一个空闲位置)int size; // 队列中当前元素的个数
} CircularQueue;// 初始化队列
void initQueue(CircularQueue* q) {q->front = 0;q->rear = 0;q->size = 0;
}// 判断队列是否为空
bool isEmpty(CircularQueue* q) {return q->size == 0;
}// 判断队列是否已满
bool isFull(CircularQueue* q) {return q->size == M;
}// 从队头插入元素
bool enqueueFront(CircularQueue* q, int value) {if (isFull(q)) {printf("队列已满,无法从队头插入\n");return false;}int newFront = (q->front - 1 + M) % M; // 计算新的队头位置(考虑循环)if (newFront == q->rear) {printf("内部错误:插入位置冲突\n");return false;}q->Q[newFront] = value;q->front = newFront;q->size++;return true;
}// 从队尾删除元素
bool dequeueRear(CircularQueue* q, int* value) {if (isEmpty(q)) {printf("队列为空,无法从队尾删除\n");return false;}*value = q->Q[q->rear - 1]; q->rear = (q->rear - 1 + M) % M; // 更新队尾指针(考虑循环)q->size--;if (q->size == 0) {q->front = 0;q->rear = 0;}return true;
}// 打印队列元素(用于调试)
void printQueue(CircularQueue* q) {if (isEmpty(q)) {printf("队列为空\n");return;}printf("队列元素: ");int i = q->front;for (int count = 0; count < q->size; count++) {printf("%d ", q->Q[i]);i = (i + 1) % M;}printf("\n");
}int main() {CircularQueue q;initQueue(&q);// 测试从队头插入enqueueFront(&q, 10);enqueueFront(&q, 20);enqueueFront(&q, 30);printQueue(&q); // 应打印: 队列元素: 30 20 10// 测试从队尾删除int value;dequeueRear(&q, &value);printf("从队尾删除的元素: %d\n", value); printQueue(&q);return 0;
}

(10)已知f为单链表的

#include <iostream>
#include <climits> // 定义链表节点结构
struct Node {int data;Node* next;// 构造函数Node(int val) : data(val), next(nullptr) {}
};// (1)求链表中的最大整数
int findMaxRecursive(Node* head) {if (head == nullptr) {std::cerr << "Error: head is nullptr" << std::endl;exit(EXIT_FAILURE); }// 只有一个元素时,直接返回该元素if (head->next == nullptr) {return head->data;}// 递归情况:比较当前元素和剩余链表中的最大值int maxInRest = findMaxRecursive(head->next);return (head->data > maxInRest) ? head->data : maxInRest;
}// (2)求链表的节点个数
int countNodesRecursive(Node* head) {// 基本情况:链表为空时,节点个数为0if (head == nullptr) {return 0;}// 递归情况:当前节点加上剩余链表的节点个数return 1 + countNodesRecursive(head->next);
}// (3)求链表中所有元素的平均值(使用辅助函数)
double findAverageHelper(Node* head, int& totalSum, int& totalCount) {if (head == nullptr) {return 0;}totalSum += head->data;totalCount++;return findAverageHelper(head->next, totalSum, totalCount);
}double findAverageRecursive(Node* head) {int totalSum = 0;int totalCount = 0;// 调用辅助函数进行递归计算findAverageHelper(head, totalSum, totalCount);// 返回平均值return (totalCount > 0) ? static_cast<double>(totalSum) / totalCount : 0.0;
}int main() {// 创建链表:1 -> 3 -> 2 -> 5 -> 4Node* first = new Node(1);first->next = new Node(3);first->next->next = new Node(2);first->next->next->next = new Node(5);first->next->next->next->next = new Node(4);// 测试函数std::cout << "最大整数: " << findMaxRecursive(first) << std::endl; // 应输出5std::cout << "节点个数: " << countNodesRecursive(first) << std::endl; // 应输出5std::cout << "所有整数的平均值: " << findAverageRecursive(first) << std::endl; // 应输出3.0return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot的网上商城购物系统

作者&#xff1a;学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”&#xff0c;支持远程部署调试、运行安装。 目录 项目包含&#xff1a; 开发说明&#xff1a; 系统功能&#xff1a; 项目截图…

API架构风格的深度解析与选择策略:SOAP、REST、GraphQL与RPC

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

【网络协议】开放式最短路径优先协议OSPF详解(四)

前言 在本章的第一部分和第二部分中&#xff0c;我们探讨了OSPF的基本配置&#xff0c;并进一步学习了更多OSPF的概念&#xff0c;例如静态路由的重分发及其度量值。在第三部分中&#xff0c;我们讨论了多区域OSPF。在第四部分中&#xff0c;我们将关注OSPF与多访问网络&#…

上门按摩系统架构与功能分析

一、系统架构 服务端&#xff1a;Java&#xff08;最低JDK1.8&#xff0c;支持JDK11以及JDK17&#xff09;数据库&#xff1a;MySQL数据库&#xff08;标配5.7版本&#xff0c;支持MySQL8&#xff09;ORM框架&#xff1a;Mybatis&#xff08;集成通用tk-mapper&#xff0c;支持…

攻防世界 ics-07

点击之后发现有个项目管理能进&#xff0c;点进去&#xff0c;点击看到源码&#xff0c;如下三段 <?php session_start(); if (!isset($_GET[page])) { show_source(__FILE__); die(); } if (isset($_GET[page]) && $_GET[page] ! index.php) { include(flag.php);…

Spring Boot教程之四十九:Spring Boot – MongoRepository 示例

Spring Boot – MongoRepository 示例 Spring Boot 建立在 Spring 之上&#xff0c;包含 Spring 的所有功能。由于其快速的生产就绪环境&#xff0c;使开发人员能够直接专注于逻辑&#xff0c;而不必费力配置和设置&#xff0c;因此如今它正成为开发人员的最爱。Spring Boot 是…

测试ip端口-telnet开启与使用

前言 开发过程中我们总会要去测试ip通不通&#xff0c;或者ip下某个端口是否可以联通&#xff0c;为此我们可以使用telnet 命令来实现。 一、telnet 开启 可能有些人使用telnet报错&#xff0c;不是内部命令&#xff0c;可以如下开启&#xff1a; 1、打开控制面板&#xff…

SpringBoot3动态切换数据源

背景 随着公司业务战略的发展&#xff0c;相关的软件服务也逐步的向多元化转变&#xff0c;之前是单纯的拿项目&#xff0c;赚人工钱&#xff0c;现在开始向产品化\服务化转变。最近雷袭又接到一项新的挑战&#xff1a;了解SAAS模型&#xff0c;考虑怎么将公司的产品转换成多租…

爬虫学习记录

1.概念 通过编写程序,模拟浏览器上网,然后让其去互联网上抓取数据的过程 通用爬虫:抓取的是一整张页面数据聚焦爬虫:抓取的是页面中的特定局部内容增量式爬虫:监测网站中数据更新的情况,只会抓取网站中最新更新出来的数据 robots.txt协议: 君子协议,网站后面添加robotx.txt…

通过 route 或 ip route 管理Linux主机路由

目录 一&#xff1a;route 使用说明1、查看路由信息2、删除指定路由3、增加指定路由 二&#xff1a;ip route 使用说明1、查看主机路由2、新增主机路由3、删除主机路由 通过route 或者ip route修改Linux主机路由后属于临时生效&#xff0c;系统重启后就恢复默认值了&#xff0c…

el-table表格合并某一列

需求&#xff1a;按照下图完成单元格合并&#xff0c;数据展示 可以看到科室列是需要合并的 并加背景色展示&#xff1b;具体代码如下&#xff1a; <el-tableref"tableA":data"tableDataList":header-cell-style"{ backgroundColor: #f2dcdb, col…

CSS Grid 布局全攻略:从基础到进阶

文章目录 一.Grid 是什么二.示例代码1. 基础使用 - 固定宽高2.百分百宽高3.重复设置-repeat4.单位-fr5.自适应6.间距定义其他 一.Grid 是什么 CSS 中 Grid 是一种强大的布局方式&#xff0c;它可以同时处理行和列 Grid 和Flex有一些类似&#xff0c;都是由父元素包裹子元素使用…

数据结构:包装类和泛型

目录 一、包装类 1、基本数据类型和对应的包装类 2、装箱和拆箱 3、自动装箱和自动拆箱 二、泛型 1、什么是泛型 2、泛型语法 3、泛型类 4、擦除机制 5、泛型的上界 6、泛型方法 三、通配符 1、什么是通配符 2、通配符上界 3、通配符下界 &#x1f4da…

备考蓝桥杯:顺序表相关算法题

目录 询问学号 寄包柜 移动0 颜色分类 合并两个有序数组 物品移动 询问学号 我们的思路&#xff1a;创建一个顺序表存储从1开始依次存放进入教室的学生学号&#xff0c;然后查询 #include <iostream> #include <vector> using namespace std; const int N 2…

Python入门教程 —— 网络编程

1.网络通信概念 简单来说,网络是用物理链路将各个孤立的工作站或主机相连在一起,组成数据链路,从而达到资源共享和通信的目的。 使用网络的目的,就是为了联通多方然后进行通信,即把数据从一方传递给另外一方。 前面的学习编写的程序都是单机的,即不能和其他电脑上的程…

C#异步多线程——ThreadPool线程池

C#实现异步多线程的方式有多种&#xff0c;以下总结的是ThreadPool的用法。 线程池的特点 线程池受CLR管理&#xff0c;线程的生命周期&#xff0c;任务调度等细节都不需要我们操心了&#xff0c;我们只需要专注于任务实现&#xff0c;使用ThreadPool提供的静态方法把我们的任…

68.基于SpringBoot + Vue实现的前后端分离-心灵治愈交流平台系统(项目 + 论文PPT)

项目介绍 本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述心灵治愈交流平台的当前背景以及系统开发的目的&#xff0c;后续章节将严格按照软件开发流程&#xff0c;对系统进…

Linux(上):基本知识篇

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Linux初识1 Linux简介2 Linux学习环境配置(1)安装Linux(2)FinalShell远程连接Linux服务器二、Linux基础命令1 Linux目录结构,根目录 /2 Linux命令基础(1)什么是命令、命令行?(2)…

Python中的可变对象与不可变对象;Python中的六大标准数据类型哪些属于可变对象,哪些属于不可变对象

Python中的可变对象与不可变对象&#xff1b;Python中的六大标准数据类型哪些属于可变对象&#xff0c;哪些属于不可变对象 Python中的可变对象与不可变对象一、Python的六大标准数据类型1. 数字类型 (Number)2. 字符串 (String)3. 列表 (List)4. 元组 (Tuple)5. 集合 (Set)6. …

VSCode Live Server 插件安装和使用

VSCode Live Server是一个由Ritwick Dey开发的Visual Studio Code扩展插件&#xff0c;它提供了一个带有实时重载功能的本地开发服务器。在VSCode中安装和使用Live Server插件进行实时预览和调试Web应用程序。这将大大提高前端开发效率&#xff0c;使网页设计和开发变得更为流畅…