栈的基本原理和简单应用

栈的基本原理和简单应用(括号匹配-Java)

  1. 基本原理
    栈(堆栈)是一种运算受限的线性表,只允许在表的一端进行插入(入栈:push)和删除(出栈:pop)运算。其可以进行运算的一端被称为栈顶,而另一端被称为栈底。
    在这里插入图片描述

  2. 实现
    在Java中提供了专门用于栈操作的类,Stack类(java.util.Stack),它继承了Vector类 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190709200930523.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3lveW9zZW5n,size_16,color_FFFFFF,t_70
    Stack类提供了几个基本方法:
    E push(E item):入栈
    synchronized E pop():出栈,会先调用peek()方法
    synchronized E peek():返回最后一个元素,如果长度为0,抛出EmptyStackException异常
    synchronized int search(Object o):查找距离栈顶最近的o元素的索引

3.括号匹配
基本思路为用栈存储每一个遇到的左括号,在遇到右括号时判断栈顶元素是否是与之对应的左括号,是则出栈,否则返回错误信息。
这个过程需要遍历每一个括号字符,且执行完成后栈内没有剩余的字符。
具体实现:

package demo.stack;

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

public class StackDemo {
	// a Stack
	private static Stack<Character> stack;
	// relation of brackets
	private static Map<Character, Character> relation = new HashMap<>();
	static {
		relation.put('{', '}');
		relation.put('[', ']');
		relation.put('(', ')');
	}

	/**
	 * Judging whether bracket matching is legal wrong example:{(]},}{},{})
	 * 
	 * @param bracketStr
	 * @return isLegal
	 */
	public static int isLegal(String bracketStr) {
		stack = new Stack<>();
		// an array for brackets
		char[] brackets = bracketStr.toCharArray();
		// a flag for brackets is legal(0) or not(-1)
		int isLegal = 0;

		for (int i = 0; i < brackets.length; i++) {
			if (brackets[i] == '{' || brackets[i] == '[' || brackets[i] == '(') {
				stack.push(brackets[i]);
			} else if (brackets[i] == '}' || brackets[i] == ']' || brackets[i] == ')') {
				if (stack.empty()) {
					return -1;
				} else {
					if (!(relation.get(stack.pop()) == brackets[i])) {
						return -1;
					}
				}
			}
		}
		if (!stack.empty()) {
			isLegal = -1;
		}
		return isLegal;
	}
}

测试方法:

	/**
	 * Stack Test
	 */
	@Test
	public void test() {
		String[] bracketsArray = {
				"{}(",
				"{{{[]()}{}[]}(({}))}",
				"{{{{]}(){}[]}}}",
				"{[()({}{})({})]}"
		};
		for(String brackets:bracketsArray) {
			int isLegal = StackDemo.isLegal(brackets);
			if(isLegal == 0) {
				System.out.println("Brackets \""+ brackets +"\" is legal.");
			}else {
				System.out.println("Brackets \""+ brackets +"\" is not legal.");
			}
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是一种线性数据结构,它遵循先进后出(LIFO)的原则。基本操作包括入(push)和出(pop),以及查看顶元素(top)和判断是否为空(empty)等。应用非常广泛,比如在编译器中用于处理函数调用、表达式求值等。 的实现可以使用数组或链表,其中数组实现的叫做顺序,链表实现的叫做链式。顺序的入和出操作都是在数组的末尾进行,而链式的入和出操作则是在链表的头部进行。 基本算法包括括号匹配、中缀表达式转后缀表达式、后缀表达式求值等。其中括号匹配是的典型应用,它可以用来判断一个表达式中的括号是否匹配。中缀表达式转后缀表达式和后缀表达式求值则是在编译器中常用的算法,它们可以用来实现。 下面是一个使用 Lua 实现的的代码示例: ```lua -- 的实现 local Stack = {} Stack.__index = Stack function Stack:new() local obj = {data = {}} setmetatable(obj, self) return obj end function Stack:push(value) table.insert(self.data, value) end function Stack:pop() return table.remove(self.data) end function Stack:top() return self.data[#self.data] end function Stack:empty() return #self.data == 0 end -- 使用来判断一个表达式中的括号是否匹配 function is_valid_expression(expr) local stack = Stack:new() for i = 1, #expr do local c = expr:sub(i, i) if c == '(' then stack:push(c) elseif c == ')' then if stack:empty() or stack:pop() ~= '(' then return false end end end return stack:empty() end ``` 中文加密是一种简单的加密算法,它可以将明文中的每个字符替换成另一个字符,从而达到加密的目的。下面是一个使用 Lua 实现的中文加密的代码示例: ```lua -- 中文加密的实现 local function encrypt(str) local result = {} for i = 1, #str do local c = str:sub(i, i) if c >= '一' and c <= '龥' then -- 将汉字替换成另一个汉字 table.insert(result, string.char(math.random(0x4e00, 0x9fa5))) else -- 其它字符不加密 table.insert(result, c) end end return table.concat(result) end -- 使用中文加密来加密一个字符串 local plaintext = "这是一段明文" local ciphertext = encrypt(plaintext) print(ciphertext) ``` 以上就是关于基本算法和中文加密的原理和实现的介绍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值