📄 charstackdemo.java
字号:
/*【例4-19】 使用接口描述堆栈的基本操作并用类实现其基本操作。堆栈是一种先进后出
* (First In and Last Out,FILO)的线性表,只允许从同端进行插入和删除,包括
* 初始化、入(压)栈、出(弹)栈、栈判空、取栈顶元素等基本操作。
*/
//程序清单4-19: CharStackDemo.java
package e4_19;
import java.io.*;
public class CharStackDemo {// 主类
public static void main(String args[]) throws java.io.IOException {
char choice = 0, exit = 'Y', popchar;
DynStack ds = new DynStack(10);
do {
if (exit == 'x' || exit == 'X')
return;
System.out.println();
do {
if (choice != 13 && choice != 10) {
System.out.println("For example CharacterStack");
System.out.println(" 1. 初始化栈");
System.out.println(" 2. 栈判空操作");
System.out.println(" 3. 入栈操作");
System.out.println(" 4. 出栈操作");
System.out.println(" 5. 取栈顶元素");
System.out.println(" 6. 栈置空操作");
System.out.println(" 7. 求当前栈中元素个数");
System.out.println(" 8. 输出栈中全部元素");
System.out.println(" 9. 退出操作");
System.out.print(" Choose one: ");
}
choice = (char) System.in.read();
} while (choice < '1' || choice > '9');
switch (choice) {
case '1': { ds.inistack(); ds.output(); break; }
case '2': {
if (ds.isempty())
System.out.println("---当前栈为空---");
else
System.out.println(" 当前栈不为空 ");
break;
}
case '3': {
ds.push();
ds.output(); break;
}
case '4': {
popchar = ds.pop();
if (popchar == 0)
System.out.println("---当前栈为空!---");
else
System.out.println("当前出栈元素: " + popchar);
ds.output(); break;
}
case '5': {
if (ds.gettop() == 0)
System.out.println("---当前栈为空!---");
else
System.out.println("当前栈顶元素: " + ds.gettop());
ds.output(); break;
}
case '6': { ds.clears(); ds.output(); break; }
case '7': {
System.out.println("当前栈中元素个数:" + ds.current_size());
ds.output(); break;
}
case '8': { ds.output(); break; }
case '9': { return; }
}
System.out.print("按x|X键退出操作,按其他键继续:");
exit = (char) System.in.read();
} while (exit != 'x' || exit != 'X');
}
}
// 定义一个字符栈接口ICharStack.
interface ICharStack {
void inistack(); // 1.初始化栈操作
boolean isempty(); // 2.栈判空操作
void push(); // 3.入栈操作
char pop(); // 4.出栈操作
char gettop(); // 5.取栈顶元素
void clears(); // 6.栈置空操作
int current_size(); // 7.求当前栈中元素个数
void output(); // 8.输出栈中全部元素
}
// 实现一个动态栈类DynStack.
class DynStack implements ICharStack {
private char stck[];// 用数组(线性顺序表)作为栈的物理存储结构
private int tos;// 栈顶指针
DynStack(int size) {// 构造方法
stck = new char[size];
tos = -1;
}
public void inistack() { // 1.初始化栈操作
char c = '0';
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter characters, 'q' to quit.");
do {// 从键盘读入字符
try {
c = (char) br.read();
} catch (IOException e) {
System.out.println("读入错误:" + e);
}
if (c != 13 && c != 10) {
if (tos == stck.length - 1) {
char temp[] = new char[stck.length * 2]; // double size
for (int i = 0; i < stck.length; i++)
temp[i] = stck[i];
stck = temp;
stck[++tos] = c;
} else
stck[++tos] = c;
}
} while (c != 'q');
tos--;
}
public boolean isempty() {// 2.栈判空操作
if (tos == -1)
return true;
else
return false;
}
public void push() {// 3.入栈操作
char c = '0';
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("输入进栈字符串, 'q' to quit.");
do {// 读入字符
try {
c = (char) br.read();
} catch (IOException e) {
System.out.println("读入错误:" + e);
}
if (c != 13 && c != 10) {
if (tos == stck.length - 1) {
char temp[] = new char[stck.length * 2]; // 双倍扩展
for (int i = 0; i < stck.length; i++)
temp[i] = stck[i];
stck = temp;
stck[++tos] = c;
} else
stck[++tos] = c;
}
} while (c != 'q');
tos--;
}
public char pop() {// 4.出栈操作
if (tos == -1)
return 0;
else
return stck[tos--];
}
public char gettop() {// 5.取栈顶元素
if (tos == -1)
return 0;
else
return stck[tos];
}
public void clears() {// 6.栈置空操作
tos = -1;
}
public int current_size() {// 7.求当前栈中元素个数
return tos + 1;
}
public void output() {// 8.输出栈中全部元素
System.out.println("当前栈中元素:");
System.out.println("---------------------------");
if (tos == -1)
System.out.println("---当前栈为空---");
else
for (int i = tos; i >= 0; i--)
System.out.print(stck[i] + " ");
System.out.println("\n---------------------------\n");
};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -