FixedCapacityStackOfString( 1.3.2.1 P82)

来源:互联网 发布:视频转换软件 编辑:程序博客网 时间:2024/06/15 18:13
一种定容的存放String类型的栈的实现:创建一个String[]数组类型,并通过关键符号‘-’来判断是否进行出栈操作。
1.首先,new一个数组对象,String[] a = new String[];这个对象要new在构造函数里面,并通过传值cap(cap:覆盖的意思)进行数组大小定义。
2.需要一个定义大小的变量N,初始化为N = 0;
3.需要一个判断数组是否为空的方法isEmpty()。通过 return N == 0;判断,N == 0就返回true,否则就返回false。
4.进行push操作的方法,传入参数item。并使得a[N++] = item; 这句执行了两个操作,一个是赋值给a[N+1] = item; 另一个是执行了N ++操作。、
5.pop()方法,返回的是a[--N],同样执行了两个操作。

这样,一个字符串String[] 栈就创建好了。

然后测试方法:
1.创建一个FixedCapacityOfStack对象s,并初始化传入参数cap = 100;定义大小最大值。
2.执行循环体:while (!StdIn.isEmpty()).        每次写入一个String item = StdIn.readString();  
        通过关键字 ‘-’判断执行的操作。如果不等于equals("-"),执行s.push(item)方法。
                                                                否则如果s.isEmpty()不为空,执行pop()方法。


这就是对字符串栈的入栈push和出栈pop操作。

代码如下:
package chapter1.a3;

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

/**
* Created by fengjw on 2017/7/31.
*/
public class FixedCapacityStackOfStrings {
private String[] a; //stack entries
private int N;//size
public FixedCapacityStackOfStrings(int cap){
a = new String[cap];
}
public boolean isEmpty(){
return N ==0;
}
public int size(){
return N;
}
public void push(String item){
a[N++] = item;//if use push() method, the parameter N will plus one **** N = N + 1;
}
public String pop(){
return a[--N];
}
public String[] getA(){
return a;
}




public static void main(String[] args) {
//P82
FixedCapacityStackOfStrings s ;
s = new FixedCapacityStackOfStrings(100);
while (!StdIn.isEmpty()){
String item = StdIn.readString();//回车键结束
if (!item.equals("-")){
s.push(item);
}else if (!s.isEmpty()){
StdOut.print(s.pop() + " ");
}
}

/*
下面这里是输出栈中的内容的。
*/
String[] temp = s.getA();
for (int i =0; i < s.size(); i ++){
StdOut.print(temp[i] + " ");
}
StdOut.println();
StdOut.println("(" + s.size() +" left on stack)");
}
}

ctrl+d结束while循环体,切记切记!!!


测试结果:
每一个字符段要有个空格隔开,包括 - 号。




代码优化为 一种泛型的抽象数据类型。


代码如下:
public class FixedCapacityStack<Item> {
private Item[]a;
private int N;
public FixedCapacityStack(int cap){
a =(Item[])new Object[cap];
}

public boolean isEmpty(){
return N ==0;
}

public int size(){
return N;
}

public void push(Item item){
a[N++] = item;
}

public Itempop(){
return a[--N];
}

public Item[]getA(){
return a;
}

public static void main(String[] args) {
//P82
FixedCapacityStack<String> s ;
s = new FixedCapacityStack<>(100);
while (!StdIn.isEmpty()){
String item = StdIn.readString();//回车键结束
if (!item.equals("-")){
s.push(item);
}else if (!s.isEmpty()){
StdOut.print(s.pop() + " ");
}
}

/*
下面这里是输出栈中的内容的。
*/
Object[] temp = s.getA(); //这里要使用Object对象。
for (int i =0; i < s.size(); i ++){
StdOut.print(temp[i] + " ");
}
StdOut.println();
StdOut.println("(" + s.size() +" left on stack)");
}

}