栈的应用---平衡符号的检测

使用栈来实现字符串符号平衡的检测 什么是联机算法? 联机算法是在任意时刻算法对要操作的数据只读入(扫描)一次,一旦被读入并处理,它就不需要在被记忆了。而在此处理过程中算法能对它已经读入的数据立即给出相应子序列问题的正确答案。 该算法仅需要常量空间并以线性时间运行,因此联机算法几乎是完美的算法。 优点 占用空间少,所用时间少 缺点 不宜设计,正确性不易观察,同时附加保留信息较少 什么是平衡符号? 所谓平衡符号就是说,每... 阅读详情

     栈在数据结构中用处非常大,它就是一种先入后出的结构。可以用数组或者链表来完成栈的编程。具体选用哪种得看你的应用场景。Java内存中的栈用来存放已知生命周期和大小的数据,局部变量都存放在栈中。它也是是用来进行方法处理的一个数据区域,一个方法从调用到完成对应了一个栈帧从入栈到出栈的过程。

     这篇文章主要说明了栈的一个应用---平衡符号的检测。括号都是成对成对出现的,比如( ),{ },[  ]等。当然括号里面也是可以有括号的,前提是成对出现。如果括号不成对,如

[ ( ]等就说明出错了。我这里就是对三种括号进行检测( ),{ },[  ]。它们的编程过程不难,只要遇到开括号则入栈,遇到闭括号比出栈。字符串读完,如果栈里面还有数据也是错误的。这里还加入了对注释符的处理过程,注释符为 /*    */,它是两个符号,并且是连在一起,开符号和闭符号只是顺序不用。注释符号内部的数据不用检测,直接跳过。这里的处理是加了个boolean类型的note变量。note=false说明不在注释符号内,括号正常检测,note=true代表在注释内,只需要检测*符号来结束这个注释。

    下面来重点说一下/和*的检测。我的程序是当note=false时先检查/,它只能和*同时出现,如果只有他一个则出错。它不用出栈和入栈,由*来代表。后面的程序是检测*,它的出现同样要检测是否同/在一起。如果遇到的是/* ,则将*入栈,note变为true;如果遇到的是*/ ,则将*出栈,note变为false。最后,每个字符都检查玩之后,判断note是否为false并且栈里面是否还有数据。当note=false且栈里没有数据时则返回true。

   我的程序可以进行手都输入和文件的字符串检测。处理的方法是test方法,自己还写了个MyVector类。

代码如下:

---------------------------------------2015/2/5日更新----------------------------

我使用char数组存放括号对象,这种做法可能显得有点笨。对象少的话可以用if直接判断,多的话还是推荐用HashMap,将开括号和闭括号分别存在key和value上面。

import java.io.*;
public class VectorTest
{
	//栈的应用:括号的平衡检测
	public static void main(String[] args)throws Exception
	{
		System.out.println("栈的应用:括号的平衡检测(包括注释)\n括号必须成对出现(){}[],或相互嵌套如([]...{[]}),注释是/*XXX*/,注释里面的内容不进行检测");
		System.out.println("\n请选择类型:file代表文件,input代表输入,输入其他无效");
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String input=br.readLine();
		System.out.println("输入的是 "+input);
		if(input.equals("input"))
		{
			System.out.println("请输入字符串,'quit'代表退出程序");
			String text=null;;
			while(!((text=br.readLine()).equals("quit")))
			{
				System.out.println("结果:"+test(text));
			}	
			System.out.println("程序结束");
		}
		else
		{
			if(input.equals("file"))
			{
				System.out.println("请输入文件名:");
				String text=br.readLine();
				File file=new File(text);
				if(file.exists())
				{
					FileReader fr=new FileReader(file);
					StringBuilder sb=new StringBuilder();
					char[] c=new char[128];
					int i;
					while((i=fr.read(c))!=-1)
					{
						sb.append(new String(c));
					}
					System.out.println("结果是:"+test(sb.toString()));
					fr.close();
				}
				else
					System.out.println("文件不存在");
			}		
		}
	}
	//检测括号使用是否正确{},[],() 数据结构与算法分析P/65
	public static boolean test(String s)
	{
		if(s==null | s.length()<1)
			return false;
		char[] close=new char[]{'}',']',')'};   //括号的索引是对应的
		char[] open=new char[]{'{','[','('};
		char[] ch=s.trim().toCharArray();
		boolean note=false;    //注释标志位,false代表不在注释内
		MyVector<Character> my=new MyVector<Character>();
		for(int i=0;i<ch.length;i++)      //循环每个字符,然后入栈和出栈判断括号是否对应(判断开放括号和封闭括号的索引是否相等e:
		{
			if(note==false)   //说明不在注释符号内,需要每个括号都处理
			{
				if(ch[i]=='/')        //处理'/'符号,因为它总是和'*'连在一起,所以判断它的出现是不是和'*'在一起,不在一起就返回false
				{						//出入栈值只对'*'处理
					if(i>0&i<ch.length-1)
					{
						if(ch[i+1]=='*'|ch[i-1]=='*')
							continue;
						else 	
							return false;
					}
					else
					{
						if(i==0)
						{
							if(ch[i+1]!='*')
								return false;
						}
						else
						{
							if(ch[i-1]!='*')
								return false;
						}
					}
				}	
				else if(ch[i]==open[0] |ch[i]==open[1]|ch[i]==open[2] |ch[i]=='*')
				{
					if(ch[i]!='*')        //输入的是三个括号中的一个
					{
						my.push(ch[i]);
						System.out.println("入栈:"+ch[i]);
					}
					else	//输入的是'*',则要判断上一个是不是'*',如果是则一起入栈,不是则返回false
					{
						if(i>0&i<ch.length-1)
						{
							if(ch[i-1]=='/')
							{
									my.push(ch[i]);        
									System.out.println("入栈:"+"/*");
									note=true;             //开启注释,直到结束注释,中间的都不再出栈和入栈
							}
							else	
								return false;
						}
						else
							return false;
					}
				}
				else if(ch[i]==close[0] |ch[i]==close[1]|ch[i]==close[2] )
				{
					int index=4;
					for(int j=0;j<3;j++)
					{
						if(ch[i]==close[j])
						{
							index=j;
							break;
						}
					}
					if(index<4)
					{
						if(my.size()==0)
							return false;
						char c=my.pop();
						System.out.println("出栈:"+ch[i]);
						int in=4;
						for(int j=0;j<3;j++)
						{
							if(c==open[j])
							{
								in=j;
								break;
							}
						}
						if(index!=in)
							return false;
					}
				}
			}
			else       //在注释内部,遇到'*/'则结束注释
			{
				if(ch[i]=='*')
				{
					if(i>0&i<ch.length-1)
					{
						if(ch[i+1]=='/')
						{
							char c=my.pop();
							System.out.println("出栈:"+"*/");
							if(c!='*')
								return false;
							note=false;   //结束注释
						}
					}
					else
						return false;
				}
			}
		}
		if(note==true| my.size()!=0)     //开启了注释却没关闭返回false,入栈了却没出栈也返回false
			return false;
		else	
			return true;
		}
	}
//栈:入栈push,出栈pop。以数组为基础,是在数组的最后进行操作
class MyVector<E>
{
	//入栈和出栈都在数组的最后
	private int size;  //size代表元素的个数
	private int minSize=10;
	private Object[] element;
	public MyVector()
	{
		size=0;
		element=new Object[minSize];
	}
	public void push(Object o)  //入栈
	{
		ensureCapacity(size+1);
		element[size++]=o;
	}
	public E pop()    //出栈
	{
		if(size>0)
		{
			Object o=element[size-1];
			element[size-1]=null;
			size--;
			return (E)o;
		}
		else
			return null;
			
	}
	public int size()
	{
		return size;
	}
	public void clear()
	{
		element=null;
		size=0;
	}
	public void ensureCapacity(int i)
	{
		if(i<0 || i<size)
			throw new IllegalArgumentException("IllegalArgument:"+i);
		else
		{
			int j=(i*3)/2+1;
			if(j<minSize)
				j=minSize;
			Object[] old=new Object[j];
			for(int len=0;len<size;len++)
				old[len]=element[len];
			element=old;
		}
	}
	@Override
	public String toString()
	{
		StringBuilder sb=new StringBuilder();
		sb.append("[");
		for(int i=0;i<size;i++)
		{
			E e=(E)element[i];
			sb.append(e);
			if(i<(size-1))sb.append(",");
		}
		return sb.append("]").toString();
	}
}

测试结果:


【ArcGIS风暴】Win10操作系统ArcGIS许可License无法启动的解决方法汇总(绝对成功!) 文章目录1. 关闭Windows Defender2. 关闭系统防火墙3. 删除迈克菲(McAfee)杀毒软件4. 在系统服务中启动 在安装ArcGIS软件时,最重要的一步是许可服务的正常启动,通常,由于各种各样的原因,ArcGIS许可管理器License Manager十有八九会无法启动,点N多次都没反应,如果许可服务不能如愿启动的话,即使Desktop安装成功,也是无法打开的。本文汇总了Win10操作系统之上ArcGIS安装过程中可能会导致服务无法启动的原因及解决办法。 ArcGIS安装参考教程: 阅读详情

相关推荐

统信UOS服务器上,达梦DM8数据库安装避坑全记录(附大小写敏感设置)

本文详细介绍了在统信UOS服务器版上部署达梦DM8数据库的全过程,包括环境准备、安装流程、数据库实例初始化及关键参数配置,特别是大小写敏感设置的注意事项。提供了从系统配置到性能优化的完整指南,帮助用户避免常见问题,确保数据库稳定运行。

weixin_30647423的博客 332

输入括号平衡的检测程序

使用编译器编译程序时,程序出错时编译器会告诉我们那里输入有误。程序中使用到的各种括号是否匹配是编译器检验程序是否出错的一个指标。有时候我们在程序的最后少写了个右花括号},尽管实际只少写了个},可能会导致编译器报上百个错误。既然编译器都有这个括号匹配功能,试试自己能否的实现括号匹配问题。为使问题简单化,输入括号仅限花括号{}和方括号[]。 查过资料后,发现使用栈可以很好的解决上述的问题。开始时初始

可以是终点,也可以是起点,看你自己怎么选。 1098

OneNet平台MQTT连接避坑指南:C语言Token计算实战(附完整代码)

本文详细解析了OneNet平台MQTT连接中的Token计算机制,提供了C语言实现的完整代码和实战指南。通过HMAC算法和Base64编码,开发者可以高效生成安全凭证,避免常见连接问题,适用于物联网设备开发。

weixin_29193359的博客 462

栈的应用----平衡符号

平衡符号这里识别了左右的各种括号#include "stack.h" #include <string>class BalanceSymbol { public: BalanceSymbol(const string s) : symbol(s) {} bool checkSymbol() { if(symbol.size() & 1) return fa

代码的键盘手。。。 430

Ubuntu单系统安装全攻略:从删除Windows到UEFI引导设置(避坑指南)

本文提供Ubuntu单系统安装的完整指南,涵盖从安全删除Windows系统到UEFI引导设置的详细步骤。通过专业工具准备、分区方案设计、引导加载器配置等关键环节,帮助用户避免常见安装问题,实现纯净高效的Ubuntu单系统环境。特别强调UEFI引导的深度配置与安装后的性能优化,适合希望彻底转向Linux的用户。

weixin_29210727的博客 409

手把手教你排查I2C通信故障:当上拉电阻配置不当会发生什么?

本文深入解析I2C通信中上拉电阻配置不当导致的常见故障,包括波形畸变和通信失败现象。通过示波器波形分析和系统化解决方案,帮助工程师快速诊断和优化I2C总线性能,特别适用于嵌入式系统和智能设备开发场景。

weixin_33725722的博客 341

栈的应用之检测平衡符号

前言 本文主要是模拟这样一个场景:编译器检查程序的语法错误,在本文中,我不打算实现某种编程语言的语法检查,而是将问题限定在——检测括号是否成对上。 最终我们希望达到这样一个效果:每一个右花括号、右方括号、右大括号,必然要对应一个相应的左花括号、左方括号以及左大括号。也就是说; 1.序列:{[()]} 是合法的。 2.序列:{[()]}} 则是非法的。 算法 本文的算法可以描述如

ilemon 4265

《YOLO多模态创新改进专栏目录 》全网独家创新,多模态融合改进教程,包含早期融合、中期融合、后期融合、损失函数改进、二次创新模块、独家创新等几百种创新点改进,答疑群提供完整项目,永久更新中

🔥《YOLO多模态创新改进专栏》重磅来袭!🚀 本专栏汇集最新顶会顶刊创新点,提供1000+篇YOLO多模态改进方案(涵盖v8-v26),包含: 多模态融合策略(早期/中期/后期) 损失函数优化 独家创新模块 详细改进步骤 ✨特色服务: ✔️ 配套完整可运行项目 ✔️ 专业答疑群支持(含非计算机专业指导) ✔️ 持续更新至2026年 ✔️ 适用目标检测/OBB/分割/分类等多任务 💡适合人群: 科研人员 | 研究生 | 需发SCI/CCF论文者 环境要求宽松,新手友好,助力快速产出科研成果! 📈早订优

Ai缝合怪、助力小伙伴高效发论文 748

使用栈来实现符号平衡----c语言实现

使用栈来实现符号平衡—-c语言实现用栈比较容易实现的应用:符号平衡 源码如下:#include <stdio.h> #include <malloc.h> /* 编程思路:为实现符号平衡,先创建一个空栈,先读入一对符号 的左边,直到读入这对符号的右边,把符号弹出,如果这对符号 对称则继续,直到最后符号全部读完,并且栈为空。 */ struct node { char symbol;

zmyqw1524336的博客 1466

以 DeleteRestrictions 与 inlineDelete 为核心的 Fiori Elements 表格删除机制全解

SAP Fiori elements 中删除操作的设计与实现涉及多维度考量。框架默认依据 OData 元数据判断删除能力,通过 DeleteRestrictions 注解实现行级条件控制(deletable-path)。表格支持两种删除模式:工具栏集中删除与响应式表格行内删除,但二者不建议混用。关键约束包括:行内删除仅适用于 Responsive Table,且与多选功能互斥。配置需遵循三层架构:后端能力注解、前端表格形态和运行时交互。设计上强调禁用优于隐藏的可用性原则,并需保持列表页与对象页的删除体验一致

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 153

Agentic-Desktop-Pet:构建本地智能桌面助手的架构与实践

智能体(Agent)作为人工智能领域的重要概念,是指能够感知环境、自主决策并执行任务以实现目标的软件实体。其核心原理在于结合感知、决策与执行模块,通过大语言模型(LLM)等推理引擎处理信息并驱动行动。这种架构的技术价值在于将AI的认知能力与具体的操作系统环境深度融合,从而创造出能主动理解用户上下文、提供个性化服务的智能伙伴。在应用场景上,智能体技术正从云端对话机器人向本地化、场景化的桌面助手演进,旨在解决传统自动化工具缺乏智能、而纯聊天机器人脱离操作环境的问题。本文探讨的Agentic-Desktop-Pe

weixin_27210125的博客 623

Java栈的应用检测平衡符号

本文来源于啊:http://blog.youkuaiyun.com/hengjie2009/article/details/8478863package cn.thj.data_structures; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.Input

冬青的专栏 2292

LLC 谐振变换器开发设计1

本文档详细介绍了基于DSP28335的LLC谐振变换器开发设计。系统采用频率调制(FM)控制方式,实现高效率、高功率密度的隔离型DC/DC变换。文档阐述了LLC拓扑结构和工作原理,给出了谐振频率、品质因数等关键参数的计算公式。硬件设计包括功率器件选型和采样电路实现,软件部分提供了DSP28335的核心控制算法和代码示例,涵盖频率转换、PI控制和PWM生成。系统还设计了启动策略和保护机制,确保可靠运行。该设计实现了主开关零电压开通和低纹波输出特性。

331

java平衡符号_Java栈的应用检测平衡符号

本文来源于啊:http://blog.youkuaiyun.com/hengjie2009/article/details/8478863package cn.thj.data_structures;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.InputStrea...

weixin_35094438的博客 395

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JAVA中用stack平衡符号_栈的应用之检测平衡符号

前言本文主要是模拟这样一个场景:编译器检查程序的语法错误,在本文中,我不打算实现某种编程语言的语法检查,而是将问题限定在——检测括号是否成对上。最终我们希望达到这样一个效果:每一个右花括号、右方括号、右大括号,必然要对应一个相应的左花括号、左方括号以及左大括号。也就是说;1.序列:{[()]} 是合法的。2.序列:{[()]}} 则是非法的。算法本文的算法可以描述如下:做一个空栈,读入字符直到文件...

weixin_39801475的博客 378

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

重学数据结构005——栈的应用之平衡符号

之前学习了栈的基本操作,并且学习了栈的两种实现方式:链式存储和顺序存储(数组)。现在看看栈都有哪些应用。栈的一个主要应用是平衡符号。         初学者在编写代码并且编译时,难免会因为少写了一个')'和被编译器报错。也就是说,编译器会去匹配括号是否匹配。当你输入了一个'(',很自然编译器回去检查你是否有另一个')'符号与之匹配。如果所有的括号都能够成对出现,那么编译器是能够通过的。否则编译器

wawlian说 562

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

YooAsset:Unity中大型项目的资源治理体系解析

Unity资源管理本质是资源生命周期的可控性问题,涉及AssetBundle打包、热更新容错、多平台适配与运行时决策等核心环节。其原理在于将物理存储、逻辑依赖与业务语义分层解耦,通过GUID依赖建模、声明式资源组、内建Fallback机制等技术手段,提升热更新稳定性与交付鲁棒性。技术价值体现在降低AB包体积失控风险、规避Android 13权限变更导致的加载崩溃、支持HybridCLR热更无缝协同等工程痛点。典型应用场景包括DAU百万级手游、工业数字孪生系统及Pico4 VR项目。本文聚焦YooAsset作

weixin_34341229的博客 308

堆栈的应用--用C语言实现平衡符号

copy from:http://blog.chinaunix.net/uid-25502868-id-167703.html/* Check if parenthesis ( ), brackets [ ], and braces { } are balanced. 栈的应用————平衡符号 by gongzh 2011.3.12 */ /* 算法思想: Algorithm{ Make

SHIELD_SKY的专栏 1571

栈ADT

栈是限制插入和删除都只能从一个位置上操作的表,该位置是表的末端,表的末端一般叫做栈顶,对栈的基本操作有push(进栈) 插入 和 pop(出栈)删除,前者相当于在表最后的位置上插入元素,后者相当于删除最后进入栈的元素,俗称也叫先进后出表,后进先出表,我们对栈的基本操作也就是 push和pop,一般栈的模型就是存在某个元素位于栈的顶部,并且该元素是唯一可见的元素, 由于栈是一个表,所以任...

detscaozv622278146的博客 196

Java数据结构与算法分析 | 栈

GitHub源码分享 项目主页:https://github.com/gozhuyinglong/blog-demos 本文源码:https://github.com/gozhuyinglong/blog-demos/tree/main/java-data-structures 1. 栈(Stack) 栈又叫堆栈,是一种运算受限制的线性表,限定只能在一端进行插入和删除操作,该端称为栈顶(Top),相对的另一端叫栈底(Bottom)。 根据栈的定义可知,最先进入栈的元素在栈底,最后进入栈的元素在栈顶。而删

人生就是一个不断学习的过程 482

栈之经典应用

栈的应用 算术表达式的求值                   栈的应用                   由于栈结构具有的后进先出的固有特性,致使栈成为程序设计中常用的工具。以下是几个栈应用的例子。 一、算术表达式的中缀表示                   把运算符放在参与运算的两个操作数中间的算术表达式称为中缀表达式。例如:2+3*4 – 6/9 算术表达式中包含了

hehainan_86的专栏 1706

数据结构—栈

栈是一种特殊的表,它限制插入和删除只能在表的一端进行,这个位置在表的末端,称为栈顶。栈ADT有push(插入)、pop(删除)、top(查看栈顶元素)等,对空表进行pop和top操作被认为是错误栈ADT,但对满表进行push操作则认为是实现上的错误,而不是操作错误。栈中唯一可视的元素是栈顶的元素。

thdwx的博客 217

数据结构与算法--简单栈实现及其应用

栈 栈(Stack)是一种限制插入和删除只能在一个位置上进行的表,改位置是表的末端,叫做栈顶top。栈的基本操作有push (进栈)pop(出栈) 栈又叫做LIFO(后进先出)表,下图展示普通push输入,而pop和top是输出操作。普通的清空栈,判断是否空栈操作都是基本操作指令,但是我们对栈的具体修改操作基本也就是push和pop。下图模型中表示若干操作后,一个抽象的栈只有栈顶元素是可见的,其他不可见。 栈的实现 由于栈是一个表,因此任何实现表的方法都能够实现栈,显然,ArrayList, Lin

0102的博客 419

栈

栈的定义: 一种特殊的表,限制插入和删除只能在一个位置上进行的表。 栈的性质: LIFO,last in first out 栈常用的操作: 创建栈(creat) 销毁栈(distory) 清空栈(clear) 进栈(push) 出栈(pop) 获取栈顶元素(Top) 获取栈的大小(get_length) 栈的实现:   •数组实现   •单链表

kindlyde 628

表,栈,队列(二)

表,栈,队列(二).

小菜鸟博客 124
上一篇: AVL树的Java实现(递归方法)
下一篇: Hadoop学习之安装篇
火星日立zy
博客等级 码龄13年 4粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值