我们主要通过数组来模拟栈,并实现了基本的入栈、出栈、是否栈满和查看栈顶指针的基本功能。
目录
前言
我们主要i通过数组来模拟栈,并实现了基本的入栈、出栈、是否栈满和查看栈顶指针的基本功能。
提示:以下是本篇文章正文内容,下面案例可供参考
一、模拟栈
实现一个栈,栈初始为空,支持四种操作:
push x
– 向栈顶插入一个数 x;pop
– 从栈顶弹出一个数;empty
– 判断栈是否为空;query
– 查询栈顶元素。
现在要对栈进行 M个操作,其中的每个操作 3和操作 4 都要输出相应的结果。
输入格式
第一行包含整数 M,表示操作次数。
接下来 M 行,每行包含一个操作命令,操作命令为 push x
,pop
,empty
,query
中的一种。
输出格式
对于每个 empty
和 query
操作都要输出一个查询结果,每个结果占一行。
其中,empty
操作的查询结果为 YES
或 NO
,query
操作的查询结果为一个整数,表示栈顶元素的值。
数据范围
1≤M≤100000
1≤x≤109
所有操作保证合法。
二、算法思路
栈这种数据结构最主要的特点就是先进后出,我们可以想象成一个罐子,我们往里面放东西,最先拿出来的一定是最上面的即最后放入的东西。
1.变量解释
图1.1样例图
我们引入一维整型数组stack用来存储栈里面的值,然后引入一个整型变量top来表示栈顶指针即数组中栈顶元素的下标。
2.判断是否空栈
我们默认下标为0不存储值,即栈顶指针top的初始值为0,当我们的栈顶指针为0的时候就是栈内没存储任何值即空栈。
//栈空
public static boolean isEmpty(){
if(top > 0){
return false;
}
return true;
}
3.向栈顶插入一个x
图3.1模拟入栈图
我们将x的入栈,就是先让栈顶指针右移,然后再让x存入栈中即可,即stack[++top] = x。
注: ++top的意思是先让top的值加1,然后在用top的值;top++是先用top的值,然后再让top加1。要注意这两个的区别。
//入栈
public static void push(int x){
stack[++top] = x;
}
4.从栈顶弹出一个数
图4.1出栈
出栈操作我们只需要让栈顶指针左移即可,这样就可以实现出栈操作。即top--
//出栈
public static void pop(){
top--;
}
5.插看栈顶元素
我们栈顶指针top就是栈顶元素在数组中的下标,故我们查看栈顶元素就是stack[top]。
//查看栈顶元素
public static int query(){
return stack[top];
}
三、代码如下
1.代码如下(示例):
import java.io.*;
import java.util.*;
public class 模拟栈 {
static PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int N = 100010;
//栈
static int[] stack = new int[N];
//栈顶下标
static int top;
public static void main(String[] args) {
Scanner sc = new Scanner(br);
int m = Integer.parseInt(sc.nextLine());
while (m-- > 0){
String[] str = sc.nextLine().split(" ");
int x;
String cmd = str[0];
//入栈
if(cmd.equals("push")){
x = Integer.parseInt(str[1]);
push(x);
}
//出栈
else if (cmd.equals("pop")){
pop();
}
//是否空栈
else if (cmd.equals("empty")) {
pw.println(isEmpty() == true ? "YES" : "NO");
} else if (cmd.equals("query")) {
pw.println(query());
}
}
pw.flush();
}
//栈空
public static boolean isEmpty(){
if(top > 0){
return false;
}
return true;
}
//入栈
public static void push(int x){
stack[++top] = x;
}
//出栈
public static void pop(){
top--;
}
//查看栈顶元素
public static int query(){
return stack[top];
}
}
2.读入数据
10
push 5
query
push 6
pop
query
pop
empty
push 4
query
empty
3.代码运行结果
5
5
YES
4
NO
最后栈中元素为: 4。其中5和6依次入栈,又被弹出。
总结
通过数组来模拟栈,然后实现了基本的入栈、出栈、是否栈满和查看栈顶指针的基本功能。