栈既可以采用链表来表示,也可以采用数组(顺序表)来表示,我们限制的是对于存放数据的存取方式。
顺序存储:
栈的逻辑结构:
栈:只允许在一端进行插入、删除操作的线性表。
空栈:不含任何数据元素的栈。
允许插入(也称进栈、压栈、入栈)、删除(也称出栈)的一端称为栈顶。
小邋遢的衣橱小邋遢 MS.Jinlin 是个爱打扮的公主,他有很多晚礼服如"LALA" "NIHAOMA"、"WOBUHAO"、"NIHAOBUHAO"等众多衣服,可是由于衣服太多他要把它们装进箱子,但是作为公主,肯定是会突发奇想觉得哪件衣服好看,就把他拿了出来,当然那件衣服上面的衣服也被拿出来了,而且会弄乱了,小邋遢在经过几次的叠衣服和取衣服后,他想知道箱子里最上面的衣服是哪一件,如果箱子为空的话,就告诉她 Empty ,如果有多件一样的衣服,肯定是取走最上面的那一件啦。
输入:
第 1 行,输入N,代表共计进行了几次操作
第 2 行至第 N+1 行,进行in out 操作
in 为 放入衣服
out 为 取出衣服
格式:
in name1
out name2
现在有以下样例输入:
样例 1:
输入:
6
in AMDYES
in INTELNO
in USBAD
in CNYES
out INTELNO
in MDICN
输出:
MDICN
样例 2:
输入:
5
in AMDYES
in INTELNO
in USBAD
in CNYES
out AMDYES
输出:
Empty
先创建一个栈以及栈的栈顶指针,定义入栈函数、出栈函数和取栈顶函数。需要注意的是定义出栈函数的时候要判空(因为题意需要)
当栈为空时Top指针为0,随着元素的入栈,Top指针的位置也会改变,但是是在最后入栈的元素的上方。所以在定义入栈函数时要先把元素值赋给Top指针的位置,再Top+1.所以写:
Mystack[Top++]=name;
在取元素的时候应该写:return Mystack[Top-1];(因为Top指向元素上方)
代码如下:
import java.util.Scanner;
public class Main {
final static int maxsize=100005;
static String[] Mystack =new String[maxsize]; //栈
static int Top=0; //栈顶指针
static boolean in(String name)
{
if(Top>=maxsize) return false;
else {
Mystack[Top++]=name;
return true;
}
}
static boolean isEmpty(){
if(Top!=0) return false;
else return true;
}
static boolean out()
{
if(isEmpty()) return false;
else{
Top--;
return true;
}
}
static String getTop()
{
if(isEmpty()) return "";
else return Mystack[Top-1];
}
public static void main(String[] args)
{
int N;
Scanner in=new Scanner(System.in);
N=in.nextInt();
for(int i=0;i
想要更加精简的代码可以来了解以下内置栈类
Java 中栈的定义及相应的函数:
栈是 Vector 的一个子类,它实现了一个标准的后进先出的栈;堆栈定义了默认构造函数,用来创建一个空栈。
在 Java 的 stack 模板定义了如下操作流程:
push():
执行 push 时(即,将元素推入栈中),是通过将元素追加的数组的末尾中。
peek():
执行 peek 时(即,取出栈顶元素,不执行删除),是返回数组末尾的元素。
pop():
执行 pop 时(即,取出栈顶元素,并将该元素从栈中删除),是取出数组末尾的元素,然后将该元素从数组中删除。
empty():
继承于 Vector,返回是否为空
size():
继承 Vector,返回元素的个数。
若使用 Java 的内置栈类,实现流程会与上述代码有所不同:
首先需引入模板类,并定义声明一个栈类:
import java.util.Scanner;
import java.util.Stack;
public class Main {
static Stack Mystack =new Stack();
}
使用 Java 的内置栈类,可以帮我们省略以下流程:
声明并定义入栈函数声明并定义入判空函数声明并定义出栈函数声明并定义出取栈顶函数
详细代码如下(以上题为例):
import java.util.Scanner;
import java.util.Stack;
public class Main {
static Stack Mystack =new Stack();
public static void main(String[] args)
{
int N;
Scanner in=new Scanner(System.in);
N=in.nextInt();
for(int i=0;i
可以看到里面使用的方法都是上述提及的push()、peek()、pop()、empty()。用这个内置栈类的时候稍微注意下就好



