一种定容的存放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
Item
pop(){
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)")
;
}
}