08黑马笔记之栈的应用_就近匹配(括号)

2023-11-17

08黑马笔记之栈的应用_就近匹配(括号)

思想:
前提:使用栈的链式存储来实现。
1)遇到左括号就放进栈中,再遇到右括号就将左括号从栈中删除。若栈中没有元素或者不是左括号,则说明右括号匹配失败。以上是判断右括号不匹配的,下面是判断左括号不匹配

2)若栈中还有元素,说明左括号多了,左括号不匹配。将栈中多余的左括号循环一个个打印出来,按下标显示相应位置。

代码实现:
1)头文件:

#ifndef SEQLINKSTACK
#define SEQLINKSTACK

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//使用企业链表实现,也可传统
typedef struct LINKSNODE{
	struct LINKSNODE *next;
}LinkSNode;

//管理链表结构体
typedef struct LINKSTACK{
	LinkSNode head;
	int size;
}LinkStack;

//链式栈初始化
LinkStack* Init_LinkStack();
//入栈
int Push_LinkStack(LinkStack *lstack,LinkSNode *data);
//出栈
int Pop_LinkStack(LinkStack *lstack);
//判断是否为空
int IsEmpty_LinkStack(LinkStack *lstack);
//返回第一个有效元素
LinkSNode *Top_LinkStack(LinkStack *lstack);
//返回栈大小
int Size_LinkStack(LinkStack *lstack);
//清空链式栈
int Clear_LinkStack(LinkStack *lstack);
//释放内存
int Destory_LinkStack(LinkStack *lstack);

#endif

2).cpp文件:

#include"Seq_LinkStack.h"

//链式栈初始化 ok
LinkStack* Init_LinkStack(){

	LinkStack *lstack=(LinkStack*)malloc(sizeof(LinkStack));
	lstack->head.next=NULL;    
	lstack->size=0;

	return lstack;
}
//入栈 ok
int Push_LinkStack(LinkStack *lstack,LinkSNode *data){

	if(lstack==NULL){
		return -1;
	}
	if(data==NULL){
		return -1;
	}
	//每次都在链表的头结点插入,与顺序栈想反
	//所以每次对头结点操作插入
	data->next =lstack->head.next;
	lstack->head.next=data;

	lstack->size++;

	return 0;
}
//出栈  ok
int Pop_LinkStack(LinkStack *lstack){

	if(lstack==NULL){
		return -1;
	}
	if(lstack->size==0){
		return -1;
	}
	//也是只对头结点操作
	//使头结点指向第二个有效节点
	LinkSNode *first=lstack->head.next;
	lstack->head.next=first->next;  //使head指向第二个元素

	lstack->size--;

	return 0;

}
//判断是否为空
int IsEmpty_LinkStack(LinkStack *lstack){
	if(lstack==NULL){
		return -1;
	}
	if(lstack->size==0){
		return 1;
	}
	
	return 0;
}
//返回第一个有效元素 ok
LinkSNode *Top_LinkStack(LinkStack *lstack){

	if(lstack==NULL){
		return NULL;
	}
	if(lstack->size==0){
		return NULL;
	}
	return lstack->head.next;

}
//返回栈大小  ok
int Size_LinkStack(LinkStack *lstack){

	if(lstack==NULL){
		return -1;
	}

	return lstack->size;
}
//清空链式栈 ok
int Clear_LinkStack(LinkStack *lstack){
	if(lstack==NULL){
		return -1;
	}
	//lstack->head.next=NULL;
	lstack->size=0;

	return 0;
}
//释放内存
int Destory_LinkStack(LinkStack *lstack){
	if(lstack==NULL){
		return -1;
	}
	free(lstack);

	return 0;
}

3)主函数测试:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"Seq_LinkStack.h"

typedef struct MYCHAR{
	LinkSNode node;   
	char *addr;     //指向括号
	int index;      //用于保存入栈时的括号的下标
}MyChar;

//判断是否是左括号
bool IsLeft(char p){

	return p == '(';
}
//判断是否为右括号
bool IsRight(char p){

	return p == ')';    //写错成(
}

//创建一个元素并返回
MyChar* Create_MyChar(char *p,int index){
	MyChar *myc=(MyChar*)malloc(sizeof(MyChar));
	myc->addr=p;
	myc->index=index;  //入栈时用于保存括号的下标

	return myc;
}

//展示错误 index是错误括号的下标
int ShowError(char *str,int index){

	printf("%s\n",str);
	for(int i=0;i<index;i++){
		printf(" ");
	}
	printf("A");

	return 0;
}

void test01(){

	//创建链表
	LinkStack *stack=Init_LinkStack();

	
	char *str="1+2+6(dsf)df(((sflp(sdfs)";
	char *p=str;

	int index=0;

	// 1 遍历整个字符串 先将左括号放进栈 然后判断右括号
	while(*p != '\0'){

		//若是左括号,就通过结构体直接进入链式栈
		if(IsLeft(*p)){
            //入栈时需要保存括号与其下标
			Push_LinkStack(stack,(LinkSNode*)Create_MyChar(p,index));
		}

		//如果是右括号且栈有元素的话,查看栈中是否为左括号,然后出栈
		if(IsRight(*p)){
			if(Size_LinkStack(stack)>0){
				//获取栈中元素
				MyChar *mychar = (MyChar*)Top_LinkStack(stack);
				//若是左括号就出栈,不是就出错,展示错误指向该出错点
				if(IsLeft(*(mychar->addr))){
					Pop_LinkStack(stack);
					free(mychar);
				}
			}
			else{           //否则如果栈中没有元素,即!!!size=0,就是出错了,根据下标取打印该括号的位置
					printf("右括号不匹配左括号:\n");
					ShowError(str,index);
					break;
			}
			
		}

		p++;
		index++;
	}

	// 2 最后若栈中还有元素,就是因为左括号进栈多缺少右括号删除。  然后循环显示后并删除
	while(Size_LinkStack(stack)>0){
		MyChar *myc=(MyChar*)Top_LinkStack(stack);
		printf("左括号没有匹配右括号:\n");
		ShowError(str,myc->index);   //注意!!!!!是myc->index
		Pop_LinkStack(stack);
		free(myc);
	}

	printf("\n");

	Destory_LinkStack(stack);


}

int main(){

	test01();

	return 0;
}

总结就近匹配:与二叉树的非递归遍历思想基本一样。所以下面为了对比也给出二叉树的非递归遍历。

2 二叉树的非递归遍历:
前提:也使用栈的链式存储。
思想:首先将根节点放进栈中,若根节点的标志位falg为1则输出,否则为0就弹出栈,再将其右子节点、左子节点、自己(前序)放进栈中。然后取出栈顶元素判断为1就输出,再对栈的元素判断,不断的输出与放进栈中,直至栈中元素为0.

代码实现:
1)头文件.h:

#ifndef SEQLINKSTACK
#define SEQLINKSTACK

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//使用企业链表实现,也可传统
typedef struct LINKSNODE{
	struct LINKSNODE *next;
}LinkSNode;

//管理链表结构体
typedef struct LINKSTACK{
	LinkSNode head;
	int size;
}LinkStack;

//链式栈初始化
LinkStack* Init_LinkStack();
//入栈
int Push_LinkStack(LinkStack *lstack,LinkSNode *data);
//出栈
int Pop_LinkStack(LinkStack *lstack);
//判断是否为空
int IsEmpty_LinkStack(LinkStack *lstack);
//返回第一个有效元素
LinkSNode *Top_LinkStack(LinkStack *lstack);
//返回栈大小
int Size_LinkStack(LinkStack *lstack);
//清空链式栈
int Clear_LinkStack(LinkStack *lstack);
//释放内存
int Destory_LinkStack(LinkStack *lstack);

#endif

2).cpp文件:

#include"Seq_LinkStack.h"

//链式栈初始化 ok
LinkStack* Init_LinkStack(){

	LinkStack *lstack=(LinkStack*)malloc(sizeof(LinkStack));
	lstack->head.next=NULL;    
	lstack->size=0;

	return lstack;
}
//入栈 ok
int Push_LinkStack(LinkStack *lstack,LinkSNode *data){

	if(lstack==NULL){
		return -1;
	}
	if(data==NULL){
		return -1;
	}
	//每次都在链表的头结点插入,与顺序栈想反
	//所以每次对头结点操作插入
	data->next =lstack->head.next;
	lstack->head.next=data;

	lstack->size++;

	return 0;
}
//出栈  ok
int Pop_LinkStack(LinkStack *lstack){

	if(lstack==NULL){
		return -1;
	}
	if(lstack->size==0){
		return -1;
	}
	//也是只对头结点操作
	//使头结点指向第二个有效节点
	LinkSNode *first=lstack->head.next;
	lstack->head.next=first->next;  //使head指向第二个元素

	lstack->size--;

	return 0;

}
//判断是否为空
int IsEmpty_LinkStack(LinkStack *lstack){
	if(lstack==NULL){
		return -1;
	}
	if(lstack->size==0){
		return 1;
	}
	
	return 0;
}
//返回第一个有效元素 ok
LinkSNode *Top_LinkStack(LinkStack *lstack){

	if(lstack==NULL){
		return NULL;
	}
	if(lstack->size==0){
		return NULL;
	}
	return lstack->head.next;

}
//返回栈大小  ok
int Size_LinkStack(LinkStack *lstack){

	if(lstack==NULL){
		return -1;
	}

	return lstack->size;
}
//清空链式栈 ok
int Clear_LinkStack(LinkStack *lstack){
	if(lstack==NULL){
		return -1;
	}
	//lstack->head.next=NULL;
	lstack->size=0;

	return 0;
}
//释放内存
int Destory_LinkStack(LinkStack *lstack){
	if(lstack==NULL){
		return -1;
	}
	free(lstack);

	return 0;
}

3)主函数测试:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"Seq_LinkStack.h"

//定义二叉树节点
typedef struct BINARYNODE{
	char ch;
	struct BINARYNODE *lchild;  
	struct BINARYNODE *rchild;  
}BinaryNode;

//利用链式栈进行非递归遍历
//栈的节点
typedef struct BINTREESTACKNODE{
	LinkSNode node;  //挂钩
	BinaryNode *root; //二叉树节点
	bool flag;   //出入栈时是否可输出的标志位
}BinTreeStackNode;



//二叉树的递归遍历 ok 懂了
void Recursion(BinaryNode *root){

	if(root==NULL){
		return ;
	}
	//前序遍历 --根左右
	printf("%c",root->ch);
	Recursion(root->lchild);
	Recursion(root->rchild);

	return ;
}


//创建栈节点,将二叉树放进栈中
BinTreeStackNode *MyStackNode(BinaryNode *root,bool flag){
	BinTreeStackNode *node=(BinTreeStackNode*)malloc(sizeof(BinTreeStackNode));
	node->root=root;
	node->flag=false;

	return node;
}

//二叉树的非递归遍历
int UnRecursion(BinaryNode *root){

	//创建栈
	LinkStack *stack=Init_LinkStack();

	//先创建一个二叉树节点放进栈中
	Push_LinkStack(stack,(LinkSNode*)MyStackNode(root,false));   //必须是放带有二叉树节点的节点进去


	//循环放与弹出
	while(Size_LinkStack(stack)>0){

		//先取出栈中元素
		BinTreeStackNode *pcur=(BinTreeStackNode*)Top_LinkStack(stack);
		Pop_LinkStack(stack);    //有这个就不用删除malloc的节点,里面做了

		//若二叉树节点为空则不作处理
		if(pcur->root==NULL){
			continue;
		}
		//若为真则显示
		if(pcur->flag==true){
			printf("%c",pcur->root->ch);
		}else{
			//否则就将它左右子树和本身放进栈中,并且本身变为true
			//前序,但因为栈是先进后出所以倒转
			Push_LinkStack(stack,(LinkSNode*)MyStackNode(pcur->root->rchild,false));
			Push_LinkStack(stack,(LinkSNode*)MyStackNode(pcur->root->lchild,false));
			pcur->flag=true;
			Push_LinkStack(stack,(LinkSNode*)pcur);
			//这四句改一下就是中序,后序
		}


	}

	printf("\n");

	return 0;
}

void CreateBinartTree(){

	//创建数据节点
	BinaryNode node1={'A',NULL,NULL};
	BinaryNode node2={'B',NULL,NULL};
	BinaryNode node3={'C',NULL,NULL};
	BinaryNode node4={'D',NULL,NULL};
	BinaryNode node5={'E',NULL,NULL};
	BinaryNode node6={'F',NULL,NULL};
	BinaryNode node7={'G',NULL,NULL};
	BinaryNode node8={'H',NULL,NULL};

	//建立节点关系 A-F-G-H
	//              \B
	//               \C-E
	//                \D
	node1.lchild=&node2;
	node1.rchild=&node6;
	node2.rchild=&node3;
	node3.lchild=&node4;
	node3.rchild=&node5;
	node6.rchild=&node7;
	node7.rchild=&node8;

	//非递归遍历
	UnRecursion(&node1);

	//递归遍历
	Recursion(&node1);
	printf("\n");
}

int main(){

	CreateBinartTree();

	return 0;
}


//总结:这个项目有问题再释放内存那里,但是我分析过了代码应该没有问题才对啊!!!
//懂了,在拷贝时出问题!不能用原来的树的内容给他指向,导致两个二叉树的两个指针指向同一片区域,
//必须新建变量给他新的指向

//总结:名字起得有点长,自己都记不住!!!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

08黑马笔记之栈的应用_就近匹配(括号) 的相关文章

  • InvalidOperationException - 对象当前正在其他地方使用 - 红十字

    我有一个 C 桌面应用程序 其中我连续创建的一个线程从源 实际上是一台数码相机 获取图像并将其放在 GUI 中的面板 panel Image img 上 这必须是另一个线程 如它是控件的代码隐藏 该应用程序可以工作 但在某些机器上 我会在随
  • 使用 std::packaged_task/std::exception_ptr 时,线程清理程序报告数据争用

    我遇到了线程清理程序 TSan 的一些问题 抱怨某些生产代码中的数据争用 其中 std packaged task 通过将它们包装在 std function 中而移交给调度程序线程 对于这个问题 我简化了它在生产中的作用 同时触发 TSa
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 为什么 gcc 抱怨“错误:模板参数 '0' 的类型 'intT' 取决于模板参数”?

    我的编译器是gcc 4 9 0 以下代码无法编译 template
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看

随机推荐

  • python实现词云

    python实现词云 制作说明 使用python制作词云需要导入WordCloud库 该库是python中的一个非常优秀的词云展示第三方库 此外 为了能够在python中显示中文字符 还需下载 安装另一个库 jieba库 该库也是一个pyt
  • 文件搜索工具Everything

    Everything是由voidtools开发的一款文件搜索工具 这款软件是基于名称实时定位文件和目录 Everything功能强大 体积小巧 第一次安装使用时会建立一个索引数据库 将所有文件和文件夹的名称导入其中 后续使用能够以极快的速度
  • 动态链接库的创建和调用

    1 CManageCounter h 头文件 TEMPLATEDLL EXPORTS 在 配置属性 gt c c gt 预处理器 gt 预处理定义 注 自己命名 ifdef TEMPLATEDLL EXPORTS define TRADEG
  • 大一c语言选择题库及答案,c语言选择题(大一c语言编程题库)

    第一个结果是1 因为c语言中没有布尔类型 把1当作true 0当作false 看第一题 是逻辑与运算符 返回结果只会是1或0 即真或假 x 15结果大于1 被认为是真 C语言中 对文件操作的一般步骤是 A 打开文件 gt 操作文件 gt 关
  • Suricata + Wireshark离线流量日志分析

    目录 一 访问一个404网址 触发监控规则 1 使用python搭建一个虚拟访问网址 2 打开Wireshark 抓取流量监控 3 在Suricata分析数据包 流量分析经典题型 入门题型 题目 Cephalopod 图片提取 进阶题型 题
  • Java中的异常

    异常Exception 是指程序运行时 由于输入错误 网络 程序逻辑等原因导致运行时出现的问题 出现异常时 程序会暂时中断执行 并根据产生异常的原因 创建对应异常类型的异常对象 并抛出给JVM捕获处理 1 Java中的常见异常 1 Null
  • HTML5 简介及基础教程

    什么是 HTML5 HTML5是一种用于创建Web页面和应用程序的标记语言 是HTML的第五个版本 HTML5是由万维网联盟 W3C 和网络超文本应用技术工作组 WHATWG 共同开发的 并于2014年10月推出了最终版本 HTML5包括一
  • WebRTC源码架构浅析

    http www oschina net question 35855 121850
  • 【Python基础】Python简介

    开篇 从本篇文章开始 笔者将带着大家一起学习Python的入门基础知识 自从人工智能 大数据行业的兴起 Python变得炙手可热 成为了近几年最流行的语言之一 2018年 Python 语言上升了 3 62 其次是Visual Basic
  • AI算法工程师

    目录 机器学习 概率图模型 之 隐马尔可夫模型 HMM 一 马尔科夫链 二 HMM 的基本概念 1 HMM 背景与定义 2 HMM 的两个基本假设 3 确定 HMM 的两个空间和三组参数 三 HMM 三个基本问题 导图 四 HMM 相关算法
  • BLE MESH在配网广播中的Service UUID:1827与1828

    Mesh Provisioning UUID 1827 是一种服务的UUID 一般在广播包中中代表设备为未配网设备 也用于给配网器进行识别 在该服务下还有两个UUID 0x2ADB 用于写 0x2ADC 用于上报 在使用GATT配网阶段的数
  • java stack训练(1)

    有效的括号 给定一个只包括 的字符串 s 判断字符串是否有效 有效字符串需满足 左括号必须用相同类型的右括号闭合 左括号必须以正确的顺序闭合 class Solution public boolean isValid String s if
  • proteus 8.8 sp1 (含汉化、破解)安装方法

    若是按照此方法存在问题 欢迎大家留言评论 一 下载地址 链接 https pan baidu com s 1VtYO2dwKRV bMSG6xy6OEQ 提取码 pp9q 二 软件介绍 proteus软件在单片机仿真上面比较优越 8 6版本
  • linux与centos的关系

    首先大家应该都知道 操作系统主要分3个部分 分别是 内核 库 应用程序 内核主要管理与硬件的直接交互的原语代码就类似dao层的一个方法 是原子性的 而库是对内核的进一步封装 当一个功能需要多个原语时 就比如有的程序 需要键盘的输入 还需要显
  • UTSC-TK2016工具集使用笔记

    1 Pcap2Session ps1 对原始流量文件进行切分 以会话 所有层 会话 应用层 流 所有层 流 应用层的形式对原始流量文件进行切分 删除文件长度为0的数据 删除重复文件 生成2 Session文件夹 2 ProcessSessi
  • 数据结构实训-学生信息管理程序C语言版

    问题描述 学生信息包括 学号 姓名 年龄 性别 出生年月 地址 电话和 E mail等 试设计一个学生信息管理程序 实现学生信息的电子化管理 要求 使用文件方式存储数据 采用链表组织学生数据 基本要求 2 基本要求 系统以菜单方式工作 学生
  • java计算两个日期之间相差天数和相隔天数详解

    大家看到文章标题 两个日期之间相差天数和相隔天数 是否有疑惑呢 从中文字面理解 相差 和 相隔 是有区别的 然而就是这些区别害死很多人 却没有发现 在大量新增统计时是差之毫厘谬以千里 我能都发现是因为一个偶然的机会 一个项目运行几年却没有人
  • Ubuntu20.04安装后,root账户无法登录,ssh无法远程连接处理方法

    最近一直在用Ubuntu系统 发现了一些规律性的东西 每当安装完系统就得去做一些事情 要不然无法正常丝滑的使用 我把这几个罗列出来 装机的步骤我就省了 比较简单跟着向导来就行 不要最小化安装就行 1 更换apt 源为阿里云镜像源 下载包的时
  • 在前端页面下拉框动态显示数据库查询出来的结果,供客户勾选,限制客户自建字段(java版)

    最终效果 案例 前端代码 首先引入标签库jar和html代码 div class form group div
  • 08黑马笔记之栈的应用_就近匹配(括号)

    08黑马笔记之栈的应用 就近匹配 括号 思想 前提 使用栈的链式存储来实现 1 遇到左括号就放进栈中 再遇到右括号就将左括号从栈中删除 若栈中没有元素或者不是左括号 则说明右括号匹配失败 以上是判断右括号不匹配的 下面是判断左括号不匹配 2