定义堆栈接口:
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;
}
}
分享到:
相关推荐
在本主题中,我们将深入探讨栈(Stack)这一特殊的数据结构,并应用它来进行进制转换和括号匹配,这些都是编程中常见的问题解决策略。 栈是一种后进先出(Last In, First Out,简称LIFO)的数据结构,类似于日常...
4. 错误处理:括号匹配、非法字符、除以零等 5. C++ STL库的使用:`std::stack`, `std::vector`, `std::string`, `std::stringstream` 通过这样的计算器项目,开发者不仅可以巩固对C++语言的理解,还能深化对数据...
在计算机科学中,堆栈是一种后进先出(LIFO)的数据结构,常用于各种算法和操作中,如表达式求值、括号匹配和,如本例所示,进制转换。进制转换是将数字从一种基数(如二进制、八进制、十进制或十六进制)转换为另一...
此外,实验还强调了堆栈和队列在实际问题解决中的应用,如括号匹配、回文检测、事务排队模拟等,这些都是堆栈和队列强大功能的体现。 【实验代码片段】 ```c #include #include #include #define MAXSIZE 100 //...
同时,需要进行错误检查,如除数为零、括号不匹配等情况,防止程序崩溃。 五、优化与扩展 为了提升用户体验,我们可以添加历史记录功能,保存并展示之前的计算结果。此外,还可以增加科学计算模式,支持更复杂的...
2. **栈**:一种后进先出(LIFO)的数据结构,常用于实现函数调用堆栈、括号匹配等功能。 3. **链表**:由一系列节点组成的数据结构,每个节点包含数据和指向下一个节点的指针。 4. **线性数组**:一种简单的数据...
2. **进制转换**:C语言支持八进制(以0开头)、十进制(我们日常使用的计数方式)和十六进制(以0x开头)的数字表示。了解不同进制之间的转换方法是编程的基础,特别是在处理二进制数据时。 3. **算法**:算法是...
4. 任意进制转换:从十进制到其他进制,如二进制、八进制、十六进制等,可以使用模运算和除法实现。 5. 最大公约数和最小公倍数:欧几里得算法(辗转相除法)和扩展欧几里得算法是计算GCD和LCM的常用方法。 6. ...
第四章聚焦于栈与队列的数据结构,讨论了它们的定义、抽象数据类型、存储实现以及应用示例,比如进制转换、括号匹配检测和迷宫求解。 第五章探讨了递归的概念以及递归与堆栈的关系,并介绍了基于归纳的递归和递推...
此外,还探索了栈和队列的应用,如进制转换、括号匹配检测和迷宫求解。 递归章节探讨了递归的概念、递归的实现与堆栈的关系,基于归纳的递归方法,以及递推关系的求解,并介绍了分治法的基本思想及其应用示例。 树...
在计算机的计算器中,进制转换功能的设计就利用了栈的特性,将十进制数转换为二进制数的过程可以抽象为对每一位数字的处理,通过栈可以有效地管理和操作这些数字,实现进制的转换。 总之,栈和队列作为数据结构的...
例如,进制转换问题可以通过栈来实现,括号匹配可以通过检查括号的入栈和出栈顺序来验证正确性。此外,表达式求值可以使用后缀表达式(逆波兰表示法),其中栈用来临时存储运算符和操作数。舞伴问题则可以通过模拟...
在C++中,堆栈可以通过数组或链表实现,用于解决诸如括号匹配、表达式求值等问题。 - **队列**:队列是一种先进先出(FIFO)的数据结构,有队首和队尾之分。在C++中,队列可以通过数组或链表实现,如循环队列和双端...
BoxofBricks1251题目关注堆栈数据结构的应用,特别是在处理括号匹配、表达式求值等问题时。堆栈是一种后进先出(LIFO)的数据结构,广泛应用于程序设计中。掌握堆栈的使用方法,如入栈、出栈操作,对于解决各种编程...
- **堆栈的应用**:通过具体实例,如进制转换、括号匹配检测、迷宫求解,展示了栈的实际应用场景。 #### 递归 - **递归的概念与实现**:讲解了递归的基本原理,以及递归调用与系统堆栈的关系,探讨了基于归纳的...
栈常被用于需要“最后处理最先输入”的场景,例如括号匹配、递归调用、函数调用堆栈等。 初始化栈(INISTACK(&S))会将栈S设置为空栈,不含任何元素。进栈(PUSH(&S, X))将元素X插入栈顶,而出栈(POP(&S))则删除栈顶...
同时,还探讨了栈的应用,例如进制转换、括号匹配检测、迷宫求解。 第五章:递归。本章解释了递归的定义、与堆栈的关系以及递归的基本实现。深入探讨了基于归纳法的递归、递推关系求解方法,包括线性齐次递推式和非...