基础数据结构之堆栈

堆栈的定义、入栈、出栈、查询栈顶

#include <stdio.h>
#include <stdlib.h>typedef int DataType;// 定义栈节点结构体
struct StackNode;struct StackNode {DataType data;              // 节点数据struct StackNode* next;     // 指向下一个节点的指针
};// 定义栈结构体
struct Stack {struct StackNode* head;     // 栈顶节点指针int size;                   // 栈的大小(元素数量)
};// 将元素压入栈中
void StackPushStack(struct Stack* stk, DataType dt) {struct StackNode* vtx = (struct StackNode*)malloc(sizeof(struct StackNode));  // 创建新节点vtx->next = stk->head;       // 新节点的下一个节点指针指向栈顶节点vtx->data = dt;              // 设置新节点的数据为传入的数据stk->head = vtx;             // 更新栈顶节点为新节点++stk->size;                 // 增加栈的大小
}// 将栈顶元素弹出栈
void StackPopStack(struct Stack* stk) {struct StackNode* temp = stk->head;   // 临时存储栈顶节点指针stk->head = temp->next;               // 更新栈顶节点为下一个节点free(temp);                           // 释放原栈顶节点的内存--stk->size;                          // 减少栈的大小
}// 获取栈顶元素的值
DataType StackGetTop(struct Stack* stk) {return stk->head->data;     // 返回栈顶节点的数据
}int main() {// 创建一个栈struct Stack myStack;myStack.head = NULL;    // 初始化栈顶节点指针为空myStack.size = 0;       // 初始化栈的大小为0// 将元素压入栈中StackPushStack(&myStack, 10);StackPushStack(&myStack, 20);StackPushStack(&myStack, 30);// 获取栈顶元素并打印DataType top = StackGetTop(&myStack);printf("Top element: %d\n", top);// 从栈中弹出一个元素StackPopStack(&myStack);// 获取新的栈顶元素并打印top = StackGetTop(&myStack);printf("Top element after popping: %d\n", top);return 0;
}

例题1

括号的最大嵌套深度

提示

如果字符串满足以下条件之一,则可以称之为 有效括号字符串valid parentheses string,可以简写为 VPS):

  • 字符串是一个空字符串 "",或者是一个不为 "(" 或 ")" 的单字符。
  • 字符串可以写为 ABA 与 B 字符串连接),其中 A 和 B 都是 有效括号字符串 。
  • 字符串可以写为 (A),其中 A 是一个 有效括号字符串 。

类似地,可以定义任何有效括号字符串 S 的 嵌套深度 depth(S)

  • depth("") = 0
  • depth(C) = 0,其中 C 是单个字符的字符串,且该字符不是 "(" 或者 ")"
  • depth(A + B) = max(depth(A), depth(B)),其中 A 和 B 都是 有效括号字符串
  • depth("(" + A + ")") = 1 + depth(A),其中 A 是一个 有效括号字符串

例如:"""()()""()(()())" 都是 有效括号字符串(嵌套深度分别为 0、1、2),而 ")(" 、"(()" 都不是 有效括号字符串 。

给你一个 有效括号字符串 s,返回该字符串的 s 嵌套深度 。

示例 1:

输入:s = "(1+(2*3)+((8)/4))+1"
输出:3
解释:数字 8 在嵌套的 3 层括号中。

示例 2:

输入:s = "(1)+((2))+(((3)))"
输出:3

提示:

  • 1 <= s.length <= 100
  • s 由数字 0-9 和字符 '+''-''*''/''('')' 组成
  • 题目数据保证括号表达式 s 是 有效的括号表达式

 

#include <stdio.h>
#include <stdlib.h>
typedef struct {char* stack;int top;
} Stack;Stack* createStack(int capacity) {Stack* stack = (Stack*)malloc(sizeof(Stack));stack->stack = (char*)malloc(capacity * sizeof(char));stack->top = -1;return stack;
}void push(Stack* stack, char element) {stack->stack[++stack->top] = element;
}char pop(Stack* stack) {return stack->stack[stack->top--];
}int isEmpty(Stack* stack) {return stack->top == -1;
}                                                                                                    
int maxDepth(char* s) {int maxDepth = 0;int currentDepth = 0;int i = 0;Stack* stack = createStack(100);while (s[i] != '\0') {if (s[i] == '(') {push(stack, s[i]);currentDepth++;if (currentDepth > maxDepth) {maxDepth = currentDepth;}} else if (s[i] == ')') {pop(stack);currentDepth--;}i++;}return maxDepth;
}
int main() {char s[] = "(1+(2*3)+((8)/4))+1";int depth = maxDepth(s);printf("The maximum nesting depth is: %d\n", depth);return 0;
}

例题2

回文链表

给定一个链表的 头节点 head ,请判断其是否为回文链表。

如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。

示例 1:

输入: head = [1,2,3,3,2,1]
输出: true

示例 2:

输入: head = [1,2]
输出: false

提示:

  • 链表 L 的长度范围为 [1, 105]
  • 0 <= node.val <= 9
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>struct ListNode {int val;struct ListNode* next;
};// 创建一个堆栈结构
struct Stack {int* array;int top;int capacity;
};// 初始化堆栈
struct Stack* createStack(int capacity) {struct Stack* stack = (struct Stack*)malloc(sizeof(struct Stack));stack->array = (int*)malloc(capacity * sizeof(int));stack->top = -1;stack->capacity = capacity;return stack;
}// 判断堆栈是否为空
bool isEmpty(struct Stack* stack) {return stack->top == -1;
}// 判断堆栈是否已满
bool isFull(struct Stack* stack) {return stack->top == stack->capacity - 1;
}// 将元素压入堆栈
void push(struct Stack* stack, int value) {if (isFull(stack)) {return;}stack->array[++stack->top] = value;
}// 从堆栈中弹出元素
int pop(struct Stack* stack) {if (isEmpty(stack)) {return -1;}return stack->array[stack->top--];
}// 判断链表是否为回文链表
bool isPalindrome(struct ListNode* head) {if (!head || !head->next) {return true;}// 统计链表的长度int length = 0;struct ListNode* curr = head;while (curr) {length++;curr = curr->next;}// 将链表前半部分的值压入堆栈struct Stack* stack = createStack(length / 2);curr = head;int i = 0; for (i = 0; i < length / 2; i++) {push(stack, curr->val);curr = curr->next;}// 如果链表长度为奇数,跳过中间节点if (length % 2 == 1) {curr = curr->next;}// 比较链表后半部分的值与堆栈中弹出的值是否相等while (curr) {int value = pop(stack);if (value != curr->val) {return false;}curr = curr->next;}return true;
}int main() {// 创建链表 [1, 2, 3, 2, 1]struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));head->val = 1;head->next = (struct ListNode*)malloc(sizeof(struct ListNode));head->next->val = 2;head->next->next = (struct ListNode*)malloc(sizeof(struct ListNode));head->next->next->val = 3;head->next->next->next = (struct ListNode*)malloc(sizeof(struct ListNode));head->next->next->next->val = 2;head->next->next->next->next = (struct ListNode*)malloc(sizeof(struct ListNode));head->next->next->next->next->val = 1;head->next->next->next->next->next = NULL;bool isPalin = isPalindrome(head);if (isPalin) {printf("The linked list is a palindrome.\n");} else {printf("The linked list is not a palindrome.\n");}// 释放链表的内存struct ListNode* curr = head;while (curr) {struct ListNode* temp = curr;curr = curr->next;free(temp);}return 0;
}

例题3

反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>struct ListNode {int val;struct ListNode* next;
};// 创建一个堆栈结构
struct Stack {int* array;int top;int capacity;
};// 初始化堆栈
struct Stack* createStack(int capacity) {struct Stack* stack = (struct Stack*)malloc(sizeof(struct Stack));stack->array = (int*)malloc(capacity * sizeof(int));stack->top = -1;stack->capacity = capacity;return stack;
}
// 判断堆栈是否为空
bool isEmpty(struct Stack* stack) {return stack->top == -1;
}
// 判断堆栈是否已满
bool isFull(struct Stack* stack) {return stack->top == stack->capacity - 1;
}
// 将元素压入堆栈
void push(struct Stack* stack, int value) {if (isFull(stack)) {return;}stack->array[++stack->top] = value;
}
// 从堆栈中弹出元素
int pop(struct Stack* stack) {if (isEmpty(stack)) {return -1;}return stack->array[stack->top--];
}
// 反转链表
struct ListNode* reverseList(struct ListNode* head) {if (!head || !head->next) {return head;}// 统计链表的长度int length = 0;struct ListNode* curr = head;while (curr) {length++;curr = curr->next;}// 将链表的值压入堆栈struct Stack* stack = createStack(length);curr = head;int i = 0; for (i = 0; i < length; i++) {push(stack, curr->val);curr = curr->next;}// 将堆栈弹出的值给链表 curr = head;while (curr) {curr->val = pop(stack);curr = curr->next;}return head;
} int main() {// 创建链表 [1, 2, 3, 4, 5]struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));head->val = 1;head->next = (struct ListNode*)malloc(sizeof(struct ListNode));head->next->val = 2;head->next->next = (struct ListNode*)malloc(sizeof(struct ListNode));head->next->next->val = 3;head->next->next->next = (struct ListNode*)malloc(sizeof(struct ListNode));head->next->next->next->val = 4;head->next->next->next->next = (struct ListNode*)malloc(sizeof(struct ListNode));head->next->next->next->next->val = 5;head->next->next->next->next->next = NULL;head=reverseList(head);int i=0;for(i=0;i<5;i++){printf("%d ",head->val);head=head->next;}// 释放链表的内存struct ListNode* curr = head;while (curr) {struct ListNode* temp = curr;curr = curr->next;free(temp);}return 0;
}

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

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

相关文章

SpringMVC ResponseEntity常见使用场景

ResponseEntity 作为 Spring MVC controller层 的 HTTP response&#xff0c;包含 status code, headers, body 这三部分。 正常场景 RestController Slf4j public class SearchController {AutowiredUserService userService;RequestMapping(value "/getAllStudents4&…

Mixtral 8X7B MoE模型基于PAI的微调部署实践

作者&#xff1a;熊兮、求伯、一耘 引言 Mixtral 8x7B 是Mixtral AI最新发布的大语言模型&#xff0c;在许多基准测试上表现优于 GPT-3.5&#xff0c;是当前最为先进的开源大语言模型之一。阿里云人工智能平台PAI是面向开发者和企业的机器学习/深度学习平台&#xff0c;提供了…

FAST OS DOCKER 可视化Docker管理工具

介绍 FAST OS DOCKER 界面直观、简洁&#xff0c;非常适合新手使用&#xff0c;方便大家轻松上手 docker部署运行各类有趣的容器应用&#xff0c;同时 FAST OS DOCKER 为防止服务器负载过高&#xff0c;进行了底层性能优化&#xff1b;其以服务器安全为基础&#xff0c;对其进…

基于springboot+vue药店管理系统

摘要 药店管理系统的设计和应用在当前社会背景下具有巨大的实际意义和社会价值。随着医药行业的不断发展和社会健康水平的提高&#xff0c;药店作为医疗服务的一部分&#xff0c;其管理方式也需要不断创新与优化。该系统的研究不仅关系到单一药店的运营效率&#xff0c;更涉及到…

HBuilder/HBuilderX 运行APP

安装adb https://developer.android.com/tools/releases/platform-tools?hlzh-cn 配置环境变量 测试是否配置成功 adb version HBuilder/HBuilderX 配置路径 数据线连接手机 运行即可 未检测到设备排查 真机运行常见问题run | uni-app官网

多维时序 | Matlab实现GRO-CNN-LSTM-Attention淘金算法优化卷积神经网络-长短期记忆网络结合注意力机制多变量时间序列预测

多维时序 | Matlab实现GRO-CNN-LSTM-Attention淘金算法优化卷积神经网络-长短期记忆网络结合注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现GRO-CNN-LSTM-Attention淘金算法优化卷积神经网络-长短期记忆网络结合注意力机制多变量时间序列预测效果一览基本介绍程序设…

Openstack组件glance对接swift

2、glance对接swift &#xff08;1&#xff09;可直接在数据库中查看镜像存放的位置、状态、id等信息 &#xff08;2&#xff09;修改glance-api的配置文件&#xff0c;实现对接swift存储&#xff08;配置文件在/etc/glance/glance-api.conf&#xff0c;建议先拷贝一份&#x…

每日一题——LeetCode1103.分糖果 ||

方法一 个人方法&#xff1a; 有多少人就创建多大的数组并把数组的所有元素初始化为0&#xff0c;只要还有糖果&#xff0c;就循环给数组从头到尾添加糖果&#xff0c;每次分的糖果数递增1&#xff0c;最后可能刚好分完也可能不够&#xff0c;不够就还剩多少给多少。 var dis…

麒麟操作系统缓存rpm包,制作离线yum源

缓存rpm包&#xff0c;以make为例 mkdir -p /data/yum yumdownloader --resolve --destdir/data/yum make制作离线yum包 yum install createrepo -y cd /data/yum createrepo .写yum配置文件/etc/yum.repos.d/local.repo [local-repo] namelocal-repo baseurlfile:///data/…

x-cmd pkg | pypinyi - 汉字拼音转换工具

目录 简介首次用户功能特点相关工具进一步探索 简介 pypinyin 是一个汉字拼音转换工具&#xff0c;支持多种词库&#xff0c;多种输出格式&#xff0c;支持自定义词组拼音库或单字拼音库。 首次用户 使用 x env use pypinyin 即可自动下载并使用 在终端运行 eval "$(cur…

freemarker导出word文件实现动态列合并

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

如何在Linux部署OpenGauss数据管理系统并实现固定公网地址访问

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 前言 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。openGauss内核深度融合…

Visual Studio中项目添加链接文件

这个需求在VS里面使用还真不多见&#xff0c;只是最近在做项目的版本编号的时候遇到一个头大的问题&#xff0c;我一个解决方案下面有几十个类库&#xff0c;再发布的时候这几十个类库的版本号必须要统一&#xff0c;之前我们都是在单个的AssemblyInfo.cs里面去改相关的信息&am…

flask框架基本使用

一、使用pycharm创建项目 1.创建项目 2.调整默认终端 3.打开虚拟终端 打开终端可以看出使用的是p1的虚拟机终端了 4.pyCharm小技巧 在flask种输入一个完整并且存在的函数名称或者类明&#xff0c; 然后 Alt 回车&#xff0c;pycharm可以自动导包&#xff0c;不用在手动在代…

Go并发快速入门:Goroutine

Go并发&#xff1a;Goroutine 1.并发基础概念&#xff1a;进程、线程、协程 (1) 进程 可以比作食材加工的一系列动作 进程就是程序在操作系统中的一次执行过程&#xff0c;是由系统进行资源分配和调度的基本单位&#xff0c;进程是一个动态概念&#xff0c;是程序在执行过程…

jmeter--3.使用提取器进行接口关联

目录 1. 正则表达式提取器 1.1 提取单个数据 1.2 名词解释 1.3 提取多个数据 2. 边界值提取器 2.2 名词解释 3. JSON提取器 3.1 Json语法 3.2 名词解释 3.3 如果有多组数据&#xff0c;同正则方式引用数据 1. 正则表达式提取器 示例数据&#xff1a;{"access_to…

C语言指针相关知识(初阶)

目录 指针是什么 指针变量的大小 指针和指针类型 指针类型的意义 野指针 指针运算 指针-整数 指针-指针 指针的关系运算 指针和数组 二级指针 二级指针定义 指针数组 指针数组的定义 指针是什么 如下图所示&#xff08;右侧编号为内存地址&#xff09;&#xff1…

C++多线程学习[二]:线程的传参以及传参的一些坑

一、线程的传参 #include<iostream> #include<thread> #include<string> using namespace std; void threadtest(int a,double b,string str) {this_thread::sleep_for(100ms);cout << a << " " << b << " " &…

Overleaf Docker编译复现计划

Overleaf Docker编译复现计划 Overleaf Pro可以支持不同年份的Latex镜像自由选择编译&#xff0c;这实在是一个让人看了心痒痒的功能。但是很抱歉&#xff0c;这属于Pro付费功能。但是我研究了一下&#xff0c;发现其实和Docker编译相关的代码&#xff0c;社区版的很多代码都没…

docker部署mongo过程

1、拉取MongoDB镜像&#xff0c;这里拉取最新版本。 docker pull mongo2、运行容器 docker run -d --name mongo -p 27017:27017 \ -e MONGO_INITDB_ROOT_USERNAMEadmin \ -e MONGO_INITDB_ROOT_PASSWORD123456 \ mongo:latest --auth#由于 mongodb 默认情况下&#xff0c;…