数据结构栈(C语言Java语言的实现)相关习题

文章目录

    • 概念以及代码实现
    • 例题
      • [232. 用栈实现队列](https://leetcode.cn/problems/implement-queue-using-stacks/)
      • [1614. 括号的最大嵌套深度](https://leetcode.cn/problems/maximum-nesting-depth-of-the-parentheses/)
      • [234. 回文链表](https://leetcode.cn/problems/palindrome-linked-list/)
      • [1614. 括号的最大嵌套深度](https://leetcode.cn/problems/maximum-nesting-depth-of-the-parentheses/)
      • [LCR 123. 图书整理 I](https://leetcode.cn/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/)
      • [206. 反转链表](https://leetcode.cn/problems/reverse-linked-list/)
      • [402. 移掉 K 位数字](https://leetcode.cn/problems/remove-k-digits/)
      • [844. 比较含退格的字符串](https://leetcode.cn/problems/backspace-string-compare/)
      • [LCR 036. 逆波兰表达式求值](https://leetcode.cn/problems/8Zf90G/)
      • [面试题 03.01. 三合一](

概念以及代码实现

栈是仅限于在表尾进行插入和删除的线性表,它遵循先进后出,后进先出原则

  • 所以可以在递归,判断回文,反转链表…

image-20240530132703003

代码实现部分java

public interface Stack_i <T>{//入栈void push(T e);//出栈T pop();//获取栈顶元素T peek();//获取栈的元素个数int size();//栈是否为空boolean isEmpty();
}
import java.util.Random;
public class MyArr<T> {private int capacity = 0;private int size = 0;private T[] arr;public MyArr(int capacity) {if (capacity < 0) this.capacity = 10; //if no right input, we will initial capacity 10this.capacity = capacity;this.arr = (T[]) new Object[capacity];}public int getCapacity() {return capacity;}public int getSize() {return size;}public T[] setCapacity(int capacity) {if (capacity < 0) {throw new RuntimeException("扩大小异常");}this.capacity = capacity;T[] newNum = (T[]) new Object[capacity];for (int i = 0; i < this.size; ++i) {newNum[i] = this.arr[i];}return newNum;}//增加元素public void add(T val) {if (this.size >= this.capacity) {this.arr = setCapacity(2 * this.capacity);}this.arr[this.size++] = val;}//数组末尾增加元素public void addLst(T val){this.add(val);}//删除元素public  T removeByIndex(int index) {if (index < 0 || index > this.capacity) {throw new RuntimeException("数组越界");}for (int i = index; i < size - 1; ++i) {arr[i] = arr[i + 1];}size--;if (size < this.capacity / 4 && this.capacity > 4) {arr = setCapacity(this.capacity / 4);}return this.arr[index];}//删除数组末尾元素public T removeLast(){return this.removeByIndex(this.size-1);}//修改位置元素public void modify(int index, T val) {if (index < 0 || index > size - 1) {throw new RuntimeException("数组越界");}arr[index] = val;}//获取某元素位置public int locateVal(T val) {for (int i = 0; i < size; ++i) {if (arr[i] == val) {return i;//return index}}// if no find return -1return -1;}//获取尾元素public T getLast(){return this.arr[this.size-1];}//打印元素@Overridepublic String toString() {StringBuffer stringBuffer = new StringBuffer();stringBuffer.append('[');for (int i = 0; i < this.size - 1; ++i) {stringBuffer.append(arr[i] + ",");}if(size>0) stringBuffer.append(arr[size - 1]);stringBuffer.append(']');return stringBuffer.toString();}}
public class StackImplement<T> implements Stack_i<T>{private MyArr<T> data;private int size=0;@Overridepublic void push(T e) {this.size++;this.data.addLst(e);}public StackImplement() {data = new MyArr<>(10);}@Overridepublic T pop() {if(this.isEmpty()){throw new RuntimeException("栈为空");}return this.data.removeLast();}@Overridepublic T peek() {return this.data.getLast();}@Overridepublic int size() {return this.size;}@Overridepublic boolean isEmpty() {if(size==0)return true;return false;}public int getCapacity(){return this.data.getCapacity();}
}

c语言实现(顺序栈)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW 0
#define MAXSIZE 10
typedef int Status;
typedef int Element;//声明栈的顺序结构定义
typedef struct {Element* base;Element* top;int stackSize;
}SqStack;
//栈的功能
Status InitStack(SqStack* S);//初始化栈
Status Push(SqStack* S, Element e);//入栈操作
Status Pop(SqStack* S, Element* e);//出栈操作,并返回出去的值
Status IsEmpty(SqStack S);//判断栈是否为空
void PrintStack(SqStack S);//打印栈
Status OperateMenu();//用户界面选择
Element GetTop(SqStack S);//获取头元素
void DestroyStack(SqStack* S);//销毁链表
Status ClearStack(SqStack* S);//清理栈中元素
int StackLen(SqStack S);//获取栈长度int main() {SqStack S;/*赋值为NULL,确保变量具有一个初始状态,避免出现潜在问题,如果没有初始化,系统会分配一个随机地址,在后面对指针修改访问时可能会程序崩溃*/S.base = NULL;S.top = NULL;S.stackSize = 0;int choice;//记录用户选择Element e;//元素类型int temp = 0;//接受函数返回值int len;//获取栈长度while (OK) {choice = OperateMenu();switch (choice){case 1:InitStack(&S);printf("初始化栈\n");break;case 2:printf("请输入要入栈的元素\n");scanf("%d", &e);temp = Push(&S, e);if(temp==-1){printf("此栈未被初始化!\n");break;}printf("入栈成功!\n");PrintStack(S);//打印元素break;case 3:temp = Pop(&S, &e);if(temp==-1){printf("此栈未被初始化!\n");break;}if (temp == ERROR) {printf("栈空!\n");break;}printf("出栈的元素为:%d\n", e);PrintStack(S);break;case 4:temp = IsEmpty(S);if(temp==-1){printf("此栈未被初始化!\n");break;}if (temp == ERROR) {printf("不为空栈!\n");PrintStack(S);break;}printf("为空栈\n");break;case 5:PrintStack(S);break;case 6:e = GetTop(S);if(e==-2){printf("此栈未被初始化!\n");break;}if (e == -1) {printf("为空栈\n");break;}printf("栈顶元素为: %d\n", e);PrintStack(S);break;case 7:temp = ClearStack(&S);if(temp==-1){printf("此栈未被初始化!\n");break;}printf("清理成功!\n");break;case 8:len = StackLen(S);if(len == -1){printf("此栈未被初始化!\n");break;}printf("链表长度为:%d\n", len);PrintStack(S);break;case 9:DestroyStack(&S);printf("销毁成功\n");break;default:exit(OVERFLOW);}}return 0;
}
Status InitStack(SqStack* S) {S->base = (Element*)malloc(sizeof(Element) * MAXSIZE);if (S->base == NULL) {exit(OVERFLOW);//申请失败,异常结束程序}S->top = S->base;S->stackSize = MAXSIZE;//申请成功return OK;
}
Status Push(SqStack* S,Element e) {//判断栈是否初始化if(S->top==NULL||S->base==NULL){printf("此栈未被初始化!\n");return -1;}//判断栈是否满if (S->top - S->base == S->stackSize) {S->base = (Element*)realloc(S->base, sizeof(Element) * MAXSIZE);S->stackSize += MAXSIZE;S->top = S->base + MAXSIZE;}*(S->top) = e;S->top++;//插入完毕return OK;
}
Status Pop(SqStack* S, Element* e) {if(S->top==NULL||S->base==NULL)return -1;//此栈未被初始化if (S->top == S->base)return ERROR;//此时为空栈*e = *(--S->top);//出栈成功return OK;
}
Status IsEmpty(SqStack S) {if(S.top==NULL||S.base==NULL)return -1;//此栈未被初始化if (S.base == S.top)return OK;//判断空栈else return ERROR;
}
void PrintStack(SqStack S) {if(S.top==NULL||S.base==NULL){printf("此栈未被初始化\n");return;//此栈未被初始化}if (S.base == S.top) {printf("此栈为空栈\n");return;}Element* ptr = --S.top;while (ptr!=S.base) {printf("%d\t", *ptr);--ptr;}//打印栈底元素printf("%d", *S.base);printf("\n");return;
}
Status OperateMenu() {int choice = 0;//记录用户选择printf("----------------欢迎使用栈----------------\n");printf("----------------1.初始化栈----------------\n");printf("----------------2.入栈操作----------------\n");printf("----------------3.出栈操作----------------\n");printf("----------------4.判断栈是否为空----------\n");printf("----------------5.打印栈------------------\n");printf("----------------6.获取头元素--------------\n");printf("----------------7.清空列表元素------------\n");printf("----------------8.获取栈的长度------------\n");printf("----------------9.销毁栈------------------\n");printf("----------------10.退出--------------------\n");printf("----------------请输入选项----------------\n");scanf("%d", &choice);return choice;}
Element GetTop(SqStack S) {if(S.top==NULL||S.base==NULL)return -2;//此栈未被初始化if (S.base == S.top) return -1;	return *(--S.top);
}
void DestroyStack(SqStack* S) {S->base = NULL;S->top = NULL;S->stackSize = 0;
}
Status ClearStack(SqStack* S) {if(S->top==NULL||S->base==NULL)return -1;//此栈未被初始化if (S->top == S->base)return ERROR;//空表S->top = S->base;return OK;
}
int StackLen(SqStack S) {if(S.top==NULL||S.base==NULL)return -1;//此栈未被初始化return S.top - S.base;
}

例题

232. 用栈实现队列

1614. 括号的最大嵌套深度

给定 有效括号字符串 s,返回 s嵌套深度。嵌套深度是嵌套括号的 最大 数量。

示例 1:

**输入:**s = “(1+(2*3)+((8)/4))+1”

**输出:**3

**解释:**数字 8 在嵌套的 3 层括号中。

示例 2:

**输入:**s = “(1)+((2))+(((3)))”

**输出:**3

**解释:**数字 3 在嵌套的 3 层括号中。

示例 3:

**输入:**s = “()(())((()()))”

**输出:**3

提示:

  • 1 <= s.length <= 100
  • s 由数字 0-9 和字符 '+''-''*''/''('')' 组成
  • 题目数据保证括号字符串 s有效的括号字符串
javaclass Solution {public int maxDepth(String s) {// 使用top表示栈顶指针int top = 0;// 记录括号数量int res = 0;for (int i = 0; i < s.length(); ++i) {// 如果碰见左括号说明 括号深度增加 即入栈if (s.charAt(i) == '(') {++top;// 记录最大深度if (top > res) {res = top;}// 碰到右括号出栈 深度就减少} else if (s.charAt(i) == ')') {--top;}}return res;}
}

234. 回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为

回文链表

。如果是,返回 true ;否则,返回 false

示例 1:

img

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

示例 2:

img

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

提示:

  • 链表中节点数目在范围[1, 105]
  • 0 <= Node.val <= 9

**进阶:**你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public boolean isPalindrome(ListNode head) {// 利用栈的先进后出原则 /*可以把链表节点都入栈 然后逐一出栈 栈底指针与栈顶指针对比元素即可*/int[] stack = new int[100001];int base = 0;int top = 0;ListNode p = head;while (p != null) {stack[top++] = p.val;p = p.next;}--top;while(base<=top){if(stack[base]!=stack[top])return false;base = base+1;top = top-1;}return true;}
}

1614. 括号的最大嵌套深度

LCR 123. 图书整理 I

206. 反转链表

402. 移掉 K 位数字

844. 比较含退格的字符串

LCR 036. 逆波兰表达式求值

[面试题 03.01. 三合一](

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

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

相关文章

鸿蒙ArkTS声明式开发:跨平台支持列表【透明度设置】 通用属性

透明度设置 设置组件的透明度。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版…

Vue3-Vite-ts 前端生成拓扑图,复制即用

完整代码&#xff0c;复制即可用&#xff0c;样式自调 试过 jointjs dagre-d3 vis&#xff0c;好用一点 方法1&#xff1a;Vis.js npm install vis-network <template><div id"mynetwork" class"myChart" :style"{width: 100%, height: 9…

【UE5:CesiumForUnreal】——加载无高度地形数据

目录 1.实现目的 2.数据准备 2.1下载数据 2.2 数据切片 3.加载无地形数据 1.实现目的 在CesiumForUnreal插件中&#xff0c;我们加载地图和地形图层之后&#xff0c;默认都是加载的带有高程信息的地形数据&#xff0c;在实际的项目和开发中&#xff0c;有时候我们需要加载无…

lipo制作通用版本静态库

文章目录 目的了解多架构的maclipo如何利用lipo编译通用版本静态库lipo 命令整理扩展目的 主要是使用lipo命令在macOS上创建通用版本的静态库(.a文件),来支持多种架构,如arm64,x86_64。 学习目的: 了解mac 不同架构arm64, x86_64了解lipo命令了解多架构的mac 随着appl…

数据挖掘 | 实验三 决策树分类算法

文章目录 一、目的与要求二、实验设备与环境、数据三、实验内容四、实验小结 一、目的与要求 1&#xff09;熟悉决策树的原理&#xff1b; 2&#xff09;熟练使用sklearn库中相关决策树分类算法、预测方法&#xff1b; 3&#xff09;熟悉pydotplus、 GraphViz等库中决策树模型…

【期末速成】——计算机组成原理(1)概述

目录 一、什么是计算机的组成 二、冯诺依曼体系结构计算机的特点 三、计算机系统的层次结构 四、机器语言、汇编语言、高级语言, 五、 编译程序、解释程序、汇编程序 六、已知主频、CPI计算程序运行时间 一、什么是计算机的组成 计算机的组成可以分为五个部件和两个信息…

VMware虚拟机安装Ubutu

打开vmware按步骤安装 选择安装虚拟机路径 选择下载好的镜像 开启虚拟机 等待 回车确认 空格选择/取消 等待等待好按回车 输入用户名&#xff0c;密码就好了

树形结构-CRUD接口

先看一下效果&#xff1a;整体的效果 新增效果 --默认值是 default 修改效果 - 大致效果如上 --------------------------------------------------------------------------------------------------------------------------------- 下面讲解代码如何实现的 根据你使用…

SpringBoot发送Gmail邮件

1. 登录Gmail Gmail网址 点击右上角“小齿轮”&#xff0c;然后点击"查看所有设置" 点击“转发和 POP/IMAP”&#xff0c;按图中设置&#xff0c;然后点击保存&#xff1a; 2. 启用两步验证(https://myaccount.google.com/security) 登录上述网址&#xff0c;找…

测试FaceRecognitionDotNet报错“Error deserializing object of type int”

FaceRecognitionDotNet宣称是最简单的.net人脸识别模块&#xff0c;其内部使用Dlib、DlibDotNet、OpenCVSharp等模块实现人脸识别&#xff0c;网上有不少介绍文章。实际测试过程中&#xff0c;在调用FaceRecognition.Create函数创建FaceRecognition实例对象时&#xff0c;会报如…

易语言推箱子游戏(附带源码)

易语言推箱子游戏 易语言易语言的安装易语言功能特色易语言安装步骤易语言常见问题 导入游戏源码部分源码领取源码下期更新预报 易语言 易语言&#xff08;EPL&#xff09;是一门以中文作为程序代码编程语言&#xff0c;其以“易”著称&#xff0c;创始人为吴涛。易语言早期版…

linux同步搭建多台服务器

前言&#xff1a; 如果在安装服务器的过程中&#xff0c;需要安装多台服务器&#xff0c;同样的配置&#xff0c;同样的步骤就可以使用此方法&#xff0c;搭建集群同步安装 1.配置网卡 想要两台机器进行同步的话&#xff0c;必须网段是同样的&#xff0c;保持在同一网段并且能…

Golang:使用Base64Captcha生成数字字母验证码实现安全校验

Base64Captcha可以在服务端生成验证码&#xff0c;以base64的格式返回 为了能看到生成的base64验证码图片&#xff0c;我们借助gin go get -u github.com/mojocn/base64Captcha go get -u github.com/gin-gonic/gin文档的示例看起来很复杂&#xff0c;下面&#xff0c;通过简…

中学生学人工智能系列:如何用AI学化学

经常有读者朋友给公众号《人工智能怎么学》留言咨询如何使用人工智能学习语文、数学、英语、化学等科目。这些都是中学教师、中学生朋友及其家长们普遍关注的问题。仅仅使用留言回复的方式&#xff0c;不可能对这些问题做出具体和透彻的解答&#xff0c;因此本公众号近期将推出…

3D视觉系统实现自动化上下料操作

在竞争激烈的汽车制造行业&#xff0c;提高生产效率、降低成本并保证产品质量是企业持续发展的关键。特别是在汽车制造过程中&#xff0c;各种零部件的上下料操作占据了大量的生产时间&#xff0c;因此如何实现这些操作的自动化、高效化成为了一个亟待解决的问题。 富唯智能3D视…

C++学习/复习9--string的使用/迭代器/查找遍历修改转换容量等函数与重载运算符(建议记常用的)/练习

一、string类概要 1.1string类对象常见构造 1.2string中的元素访问 范围for与迭代器 容器与迭代器 算法与迭代器 反向迭代器 const迭代器 1.3string中的插入与查找 1.4string中的的容量与大小 注意1&#xff1a;不同编译器的对某些函数底层实现在遵守STL标准的情况下具体方式…

用任务监听RTOS各任务的运行状态

使用rtos时内存对于单片机来说总是非常抠搜的。 任务分配多了浪费&#xff0c;少了跑不动。 最近看到这个监听任务还是很好用的。 废话不多说。开始操作 第一步在配置文件中打开这几个宏 #define configUSE_TRACE_FACILITY 1 /*为1时启用可视化跟踪调试*/ #define conf…

两整数之和 ---- 位运算

题目链接 题目: 分析: 题目中要求不能使用-, 考虑到我们的位运算异或^, 是无进位加法, 可以使用如果是无进位加法, 那么我们就要找到进位, 并进行计算, 进位只有1和1相加时才会产生进位1, 而0和1相加无进位, 进位为0, 那么我们就想到了&运算, 1&1 1, 0&1 0, 所…

07-操作元素(键盘和鼠标事件)

在前面的文章中重点介绍了一些元素的定位方法&#xff0c;定位到元素后&#xff0c;就需要操作元素了。本篇总结了web页面常用的一些操作元素方法&#xff0c;可以统称为行为事件。 一、简单操作 点击按钮&#xff08;鼠标左键&#xff09;&#xff1a;click()清空输入框&…

基础—SQL—DQL(数据查询语言)排序查询

一、引言 排序查询这里面涉及的关键字&#xff1a;ORDER BY。在我们日常的开发中&#xff0c;这个是很常见的&#xff0c;比如打开一个网购的商城&#xff0c;这里面可以找到一个销量的排序、综合的排序、价格的排序&#xff08;升序、降序&#xff09;等等。接下来就学习这一部…