package com.stack.sym;
public interface MyStack<T> {
/*
* 属性都是public static final。 方法都是:public abstract.
*/
boolean isEmpty();// 判断栈是否为空
void clear();// 清空栈
int length();// 计算栈的长度
boolean push(T data);// 把数据压入到栈
T pop();// 从栈中取出数据
}
package com.stack.sym;
public class MyArrayStack<T> implements MyStack<T> {
private Object[] objs = new Object[16];
private int size = 0;
@Override
public void clear() {
for (int i = 0; i < objs.length; i++) {
objs[i]=null;
}
size=0;
}
@Override
public boolean isEmpty() {
return 0==size;
}
@Override
public int length() {
return size;
}
@Override
public T pop() {
if(size==0){
return null;
}
return (T) objs[--size];
}
@Override
public boolean push(T data) {
/*
* 询问是否需要扩容
*/
if (size>=objs.length) {
resize();
}
objs[size++]=data;
return true;
}
public void resize(){
Object[]temp=new Object[objs.length*3/2+1];
for (int i = 0; i < temp.length; i++) {
temp[i]=objs[i];
objs[i]=null;
}
objs=temp;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("MyArrayStack: [");
for (int i = 0; i < size; i++) {
sb.append(objs[i].toString());
if (i != size - 1) {
sb.append(", ");
}
}
sb.append("]");
return sb.toString();
}
}
package com.stack.sym;
public class Person {
Person(int age, String sex) {
this.age = age;
this.sex = sex;
}
private int age;
private String sex;
}
package com.stack.sym;
public class TestStack {
/**
* @param args
*/
public static void main(String[] args) {
MyStack<Person> myStack = new MyArrayStack<Person>();
myStack.push(new Person(2, "nv"));
myStack.push(new Person(5, "man"));
myStack.push(new Person(6, "man"));
myStack.pop();
myStack.toString();
System.out.println(myStack.length());//打印为2
System.out.println(convert(3456,4).toString());
}
/*
* 将10进制正整数num转换为n进制
*/
private static String convert(int mun,int n){
MyStack<Integer>myStack=new MyArrayStack<Integer>();
Integer result=mun;
while(true){
myStack.push(result%n);
result=result/n;
if(result%n==0){
break;
}
}
StringBuffer sBuffer=new StringBuffer();
while(myStack.pop()!=null){
sBuffer.append(myStack.pop());
}
return sBuffer.toString();
}
/*
* 遍历字符串的每一个char, 将char与栈顶元素比较. 如果char和栈顶元素配对, 则char不入栈,
* 否则将char入栈. 当遍历完成时栈为空说明字符串是合法的.
*/
public static boolean isMatch(String str){
MyStack<Character>myStack=new MyArrayStack<Character>() ;
char []arr=str.toCharArray();
for (char c:arr){
Character temp=myStack.pop();
if(temp==null){
myStack.push(c);
}
else if(temp=='['&&c==']'){
}else if (temp=='{'&&c=='}') {
}else {
myStack.push(temp);
myStack.push(c);
}
}
return myStack.isEmpty();
}
/*
* 输入行中字符'#'表示退格, '@'表示之前的输入全都无效.
* 使用栈保存输入的字符, 如果遇到'#'就将栈顶出栈, 如果遇到@就清空栈.
* 输入完成时将栈中所有字符出栈后反转就是输入的结果:
*/
public static String lineEdit(String input){
MyStack<Character>myStack=new MyArrayStack<Character>();
char[] arr = input.toCharArray();
for (char c : arr) {
if (c == '#') {
myStack.pop();
} else if (c == '@') {
myStack.clear();
} else {
myStack.push(c);
}
}
StringBuilder sb = new StringBuilder();
Character temp = null;
while ((temp = myStack.pop()) != null) {
sb.append(temp);
}
// 反转字符串
sb.reverse();
return sb.toString();
}
}
分享到:
相关推荐
《基于Linux网络协议栈实现及应用》这篇文献主要探讨了Linux操作系统中的TCP/IP协议栈的实现细节和网络编程模型。Linux以其强大的网络服务功能著称,支持多种网络协议,并能提供多种网络服务,如TCP/IP、IPX/SPX、...
本实验报告将探讨如何实现栈以及其在实际问题中的应用,包括自定义顺序栈、括号匹配检查和后缀表达式求值。 首先,我们来看“实现自己的顺序栈类”。顺序栈通常是在内存中连续分配的一段空间来存储元素,它的优点是...
本文将深入探讨Java中栈的实现以及其在实际应用中的使用。 首先,我们来理解栈的基本概念。栈是一种特殊类型的线性数据结构,其中元素的添加和删除操作(称为入栈和出栈)只在数据结构的一端进行,这一端被称为栈顶...
2、掌握在顺序栈上实现的六种基本算法。 2、掌握顺序栈的简单应用。 利用顺序栈将一个非负的十进制整数N转换为对应的B进制数。 [基本要求]非负的十进制整数N和B都从键盘输入;转换结果从屏幕输出。
### 栈和队列的基本操作实现及其应用实验报告 #### 实验目的 1. **熟练掌握栈和队列的基本操作**:在数组和链表两种存储结构上实现栈和队列的基本操作。 2. **应用栈和队列解决实际问题**:通过具体的编程练习,...
`实验三 栈的实现及应用.doc`可能是关于这些概念的详细解释和实验指导,而`03 栈与队列.ppt`可能是相关课程的幻灯片,涵盖了栈和队列的基本理论和应用。 理解并熟练掌握栈的实现、进制转换以及括号匹配等基本算法,...
2、掌握在顺序栈上实现的六种基本算法。 2、掌握顺序栈的简单应用。 二、实验内容 1、利用顺序栈将一个非负的十进制整数N转换为对应的B进制数。 [基本要求]非负的十进制整数N和B都从键盘输入;转换结果从屏幕输出。
2、利用栈实现中缀表达式与前缀表达式的转换。 三、相关内容介绍 标准的表达式如"A+B",在数学上学名叫中缀表达式(Infix Notation),原因是运算符号在两个运算对象的中间。相对应的还有前缀表达式(Prefix ...
栈在许多应用场景中都发挥着关键作用,尤其是在实现复杂计算逻辑时,如计算器的运算过程。本篇将详细介绍如何使用C语言实现一个基于栈的计算器。 首先,我们需要理解栈的基本操作:入栈(push)、出栈(pop)、查看...
栈在很多算法中都有应用,如函数调用、括号匹配、表达式求值等。 知识点2:C++编程语言中的结构体(struct) C++中的结构体是一种用户自定义的类型,它可以包含不同类型的数据项。在这个计算器的实现中,使用了两个...
C语言实现栈实现表达式运算的应用,很好用,有需要的来下载。
### 数据结构栈实现表达式求值 #### 一、引言 在计算机科学领域,数据结构是存储和组织数据的一种特殊方式,它不仅能够提高算法的效率,还能够简化复杂问题的解决过程。栈是一种非常重要的线性数据结构,遵循后进先...
Educoder题目:数据结构-栈基本运算的实现及其应用答案解析.md
【栈和队列的基本操作实现及其应用】 栈和队列是两种重要的数据结构,它们在计算机科学和软件工程中有着广泛的应用。本实验旨在通过实际操作加深对这两种数据结构的理解,并学习如何用它们来解决实际问题。 栈是一...
详述了嵌入式TCP/IP协议栈在基于ARM7 MCU的硬件平台上的实现原理,并给出了包括链路层(以太网和PPP)、IP层、运输层及应用层的一个完整协议栈实现的全部源代码。通过一个模拟的现实世界应用,展示了基于UDP和基于...
栈在程序设计中有多种应用,如括号匹配、表达式求值、深度优先搜索等。 在C语言中,我们可以使用结构体来定义一个顺序栈。例如,`SqStack` 结构体包含了栈的底地址 `base`,栈顶指针 `top` 以及栈的当前最大容量 `...
本主题将探讨栈的一些基本应用以及如何实现这些功能。 1. 符号就近匹配:在编程语言解析和编译过程中,符号就近匹配是常见的应用场景。例如,当解析括号、引号等配对符号时,我们可以通过栈来检查一对括号是否正确...