`

括号匹配、进制转换与堆栈

 
阅读更多

定义堆栈接口:

 

package stack;

public interface Stack {
	//返回堆栈的大小
	public int getSize();
	//判断堆栈是否为空
	public boolean isEmpty();
	//数据元素e入栈
	public void push(Object e);
	//栈顶元素出栈
	public Object pop()throws StackEmptyException;
	//取栈顶元素看看
	public Object peek()throws StackEmptyException;
}

 定义节点类型:

 

package stack;

public class SLNode {
	public SLNode next;
	public Object e;
	
	public SLNode(SLNode next,Object e)
	{
		this.next=next;
		this.e=e;
	}

}

 堆栈实现:

 

package stack;

public class StackSLinked implements Stack{
	private SLNode top;
	private int size;//标记栈的大小
	
	public StackSLinked()
	{
		top=null;size=0;
	}

	@Override
	public int getSize() {
		
		return size;
	}

	@Override
	public boolean isEmpty() {
		// TODO Auto-generated method stub
		return size==0;
	}

	@Override
	public void push(Object e) {
		SLNode q=new SLNode(top,e);
		top=q;
		size++;
		
	}

	@Override
	public Object pop() throws StackEmptyException {
		if(size<1)
			throw new StackEmptyException("栈为空");
		Object obj=top.e;
		top=top.next;
		size--;
		return obj;
	}

	@Override
	public Object peek() throws StackEmptyException {
		if(size<1)
		{
			throw new StackEmptyException("栈为空");
			
		}
		
		return top.e;
	}

}

 堆栈异常定义:

 

package stack;

public class StackEmptyException extends Exception{
	
	public StackEmptyException(String exception)
	{
		super(exception);
		
	}

}

 

Client 包含括号匹配和进制转换算法:

 

package stack;

public class Client {
	public static void main(String[] args) {
		//baseConversion(8);
		System.out.println(bracketMatch("{[wf(wf)]}"));

	}

	// 进制转换算法
	public static void baseConversion(int val) {
		Stack s = new StackSLinked();
		while (val > 0) {
			s.push(val % 8 + "");
			val = val / 8;
		}
		while (!s.isEmpty())
			try {
				System.out.print((String) s.pop());
			} catch (StackEmptyException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}

	// 括号匹配算法
	public static boolean bracketMatch(String str) {
		Stack s = new StackSLinked();
		for (int i = 0; i < str.length(); i++) {
			char c = str.charAt(i);
			switch (c) {
			case '{':
			case '[':
			case '(':
				s.push(Integer.valueOf(c));
				break;
			case '}':
				try {
					if (!s.isEmpty() && ((Integer) s.pop()).intValue() == '{')
						break;
					else
						return false;
				} catch (StackEmptyException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			case ']':
				try {
					if (!s.isEmpty() && ((Integer) s.pop()).intValue() == '[')
						break;
					else
						return false;
				} catch (StackEmptyException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			case ')':
				try {
					if (!s.isEmpty() && ((Integer) s.pop()).intValue() == '(')
						break;
					else
						return false;
				} catch (StackEmptyException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

			}

		}
		if (s.isEmpty())
			return true;
		else
			return false;

	}

}
 
1
0
分享到:
评论

相关推荐

    数据结构-栈进制转换和括号匹配

    在本主题中,我们将深入探讨栈(Stack)这一特殊的数据结构,并应用它来进行进制转换和括号匹配,这些都是编程中常见的问题解决策略。 栈是一种后进先出(Last In, First Out,简称LIFO)的数据结构,类似于日常...

    C++十进制计算器 能够接受复杂表达式 基于堆栈

    4. 错误处理:括号匹配、非法字符、除以零等 5. C++ STL库的使用:`std::stack`, `std::vector`, `std::string`, `std::stringstream` 通过这样的计算器项目,开发者不仅可以巩固对C++语言的理解,还能深化对数据...

    lhy.rar_acs

    在计算机科学中,堆栈是一种后进先出(LIFO)的数据结构,常用于各种算法和操作中,如表达式求值、括号匹配和,如本例所示,进制转换。进制转换是将数字从一种基数(如二进制、八进制、十进制或十六进制)转换为另一...

    实验二 堆栈和队列基本操作的编程实现

    此外,实验还强调了堆栈和队列在实际问题解决中的应用,如括号匹配、回文检测、事务排队模拟等,这些都是堆栈和队列强大功能的体现。 【实验代码片段】 ```c #include #include #include #define MAXSIZE 100 //...

    多功能MFC计算器(适用于VS2017)

    同时,需要进行错误检查,如除数为零、括号不匹配等情况,防止程序崩溃。 五、优化与扩展 为了提升用户体验,我们可以添加历史记录功能,保存并展示之前的计算结果。此外,还可以增加科学计算模式,支持更复杂的...

    初赛知识点的整理和总结

    2. **栈**:一种后进先出(LIFO)的数据结构,常用于实现函数调用堆栈、括号匹配等功能。 3. **链表**:由一系列节点组成的数据结构,每个节点包含数据和指向下一个节点的指针。 4. **线性数组**:一种简单的数据...

    有关于C语言的C语言总结.zip

    2. **进制转换**:C语言支持八进制(以0开头)、十进制(我们日常使用的计数方式)和十六进制(以0x开头)的数字表示。了解不同进制之间的转换方法是编程的基础,特别是在处理二进制数据时。 3. **算法**:算法是...

    ACM函数整理_ACM模板

    4. 任意进制转换:从十进制到其他进制,如二进制、八进制、十六进制等,可以使用模运算和除法实现。 5. 最大公约数和最小公倍数:欧几里得算法(辗转相除法)和扩展欧几里得算法是计算GCD和LCM的常用方法。 6. ...

    数据结构与算法(Java语言版) 周鹏 三峡大学理学院

    第四章聚焦于栈与队列的数据结构,讨论了它们的定义、抽象数据类型、存储实现以及应用示例,比如进制转换、括号匹配检测和迷宫求解。 第五章探讨了递归的概念以及递归与堆栈的关系,并介绍了基于归纳的递归和递推...

    数据结构与算法(JAVA语言版解密)

    此外,还探索了栈和队列的应用,如进制转换、括号匹配检测和迷宫求解。 递归章节探讨了递归的概念、递归的实现与堆栈的关系,基于归纳的递归方法,以及递推关系的求解,并介绍了分治法的基本思想及其应用示例。 树...

    数据结构-3期(KC002) 栈和队列的结构分析与应用.docx

    在计算机的计算器中,进制转换功能的设计就利用了栈的特性,将十进制数转换为二进制数的过程可以抽象为对每一位数字的处理,通过栈可以有效地管理和操作这些数字,实现进制的转换。 总之,栈和队列作为数据结构的...

    【数据结构】第五周 栈与队列.pdf

    例如,进制转换问题可以通过栈来实现,括号匹配可以通过检查括号的入栈和出栈顺序来验证正确性。此外,表达式求值可以使用后缀表达式(逆波兰表示法),其中栈用来临时存储运算符和操作数。舞伴问题则可以通过模拟...

    数据结构(C++)电子书

    在C++中,堆栈可以通过数组或链表实现,用于解决诸如括号匹配、表达式求值等问题。 - **队列**:队列是一种先进先出(FIFO)的数据结构,有队首和队尾之分。在C++中,队列可以通过数组或链表实现,如循环队列和双端...

    ZOJ解题报告ZOJ解题报告

    BoxofBricks1251题目关注堆栈数据结构的应用,特别是在处理括号匹配、表达式求值等问题时。堆栈是一种后进先出(LIFO)的数据结构,广泛应用于程序设计中。掌握堆栈的使用方法,如入栈、出栈操作,对于解决各种编程...

    数据结构与算法

    - **堆栈的应用**:通过具体实例,如进制转换、括号匹配检测、迷宫求解,展示了栈的实际应用场景。 #### 递归 - **递归的概念与实现**:讲解了递归的基本原理,以及递归调用与系统堆栈的关系,探讨了基于归纳的...

    C语言数据结构线性表,链表

    栈常被用于需要“最后处理最先输入”的场景,例如括号匹配、递归调用、函数调用堆栈等。 初始化栈(INISTACK(&S))会将栈S设置为空栈,不含任何元素。进栈(PUSH(&S, X))将元素X插入栈顶,而出栈(POP(&S))则删除栈顶...

    java数据结构与算法

    同时,还探讨了栈的应用,例如进制转换、括号匹配检测、迷宫求解。 第五章:递归。本章解释了递归的定义、与堆栈的关系以及递归的基本实现。深入探讨了基于归纳法的递归、递推关系求解方法,包括线性齐次递推式和非...

Global site tag (gtag.js) - Google Analytics