• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
百事可爱
一起努力鸭~~~
博客园    首页    新随笔    联系   管理    订阅  订阅
栈(stack) 先进后出

栈(stack) 先进后出

  1. 栈:只允许在一端进行插入、删除操作的线性表。
  2. 空栈:不含任何数据元素的栈。
  3. 允许插入(也称进栈、压栈、入栈)、删除(也称出栈)的一端称为栈顶。

1. 用数组模拟栈的实现:

小邋遢的衣橱
小邋遢 MS.Jinlin 是个爱打扮的公主,他有很多晚礼服如"LALA" "NIHAOMA"、"WOBUHAO"、"NIHAOBUHAO"等众多衣服,小邋遢在经过几次的叠衣服和取衣服后,他想知道箱子里最上面的衣服是哪一件,如果箱子为空的话,就告诉她 Empty ,如果有多件一样的衣服,肯定是取走最上面的那一件啦。
输入:
第 1 行,输入N,代表共计进行了几次操作
第 2 行至第 N+1 行,进行in out 操作
in 为 放入衣服
out 为 取出衣服
格式:
in name1
out name2
样例 :
输入:

6
in AMDYES
in INTELNO
in USBAD
in CNYES
out INTELNO
in MDICN

输出:

MDICN
代码实现:

package 栈;

import java.util.Scanner;

public class QuYiFu {
	final static int maxsize = 100005;

	public static void main(String[] args) {

		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();// 操作次数

		for (int i = 0; i < n; i++) {
			String opString = scanner.next();//每次操作时,是放进in还是取出out,就是来存放每次操作的前面的字符串
			String nameString = scanner.next();
			//当是存进,in操作,就调用入栈函数
			if(opString.contains("in")) {
				in(nameString);
			}
			else {//当是取出,out操作,就调用出栈函数
				//首先要先判断栈顶元素是否是要取出的,若不是,就循环输出前面不是的元素
				while(!getTop().equals(nameString)) {
					out();
				}
				out();
			}
			
		}
		
		//接下来,就是输出部分:
		if(isEmpty()) {
			System.out.println("Empty");
		}
		else {
			System.out.println(getTop());
		}
	}

	// 1.先建存放栈数据结构,采用顺序表
	static String[] mystack = new String[maxsize]; // 栈
	static int top = 0; // 栈顶指针

	// 2.声明并定义入栈函数
	static boolean in(String name) {
		// 判栈满
		if (top >= maxsize) {
			return false;
		} else {
			mystack[++top] = name;//此处,必须为++top 先令top+1 ,比如,起初top=0 必须先加1,代表存进栈的元素个数加1
			return true;
		}
	}

	// 3.判栈是否为空
	static boolean isEmpty() {
		if (top != 0) {
			return false;
		} else {
			return true;
		}
	}

	// 4. 声明并定义出栈函数
	static boolean out() {
		// 判栈空
		if (isEmpty()) {
			return false;
		} else {
			top--;
			return true;
		}
	}

	// 5.获取栈顶元素
	static String getTop() {
		// 判空
		if (isEmpty()) {
			return "";
		} else {
			return mystack[top];
		}
	}

}

2. Java 的内置栈类

  1. 栈是 Vector 的一个子类,它实现了一个标准的后进先出的栈,至于什么是 Vector,大家可以理解为能力超强的数组;

  2. 堆栈定义了默认构造函数,用来创建一个空栈。

    在 Java 的 stack 模板定义了如下操作流程:

    1. push():

      执行 push 时(即,将元素推入栈中),是通过将元素追加的数组的末尾中。

    2. peek():

      执行 peek 时(即,取出栈顶元素,不执行删除,可以理解为只是看一眼),是返回数组末尾的元素。

    3. pop():

      执行 pop 时(即,取出栈顶元素,并将该元素从栈中删除),是取出数组末尾的元素,然后将该元素从数组中删除。

    4. empty():

      继承于 Vector,返回是否为空

    5. size():

      继承 Vector,返回元素的个数。

      代码实现:

      package 栈;
      import java.util.Scanner;
      import java.util.Stack;
      
      public class QuYiFu2 {
      	
      	static Stack mystack = new Stack ();
      	
      	public static void main(String[] args) {
      		
      		Scanner scanner = new Scanner(System.in);
      		int n = scanner.nextInt();// 操作次数
      
      		for (int i = 0; i < n; i++) {
      			String opString = scanner.next();//每次操作时,是放进in还是取出out,就是来存放每次操作的前面的字符串
      			String nameString = scanner.next();
      			//当是存进,in操作,就调用入栈函数
      			if(opString.contains("in")) {
      				 mystack.push(nameString);			}
      			else {//当是取出,out操作,就调用出栈函数
      				//首先要先判断栈顶元素是否是要取出的,若不是,就循环输出前面不是的元素
      				while(!mystack.peek().equals(nameString)) {
      					 mystack.pop();
      				}
      				 mystack.pop();
      			}
      			
      		}
      		
      		//接下来,就是输出部分:
      		if (( mystack.empty())) {
      			System.out.println("Empty");
      		}
      		else {
      			System.out.println(mystack.peek());
      		}
      	}
      }
      
posted on 2022-03-24 18:39  精致猪猪侠  阅读(416)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3