算法学习记录——最小栈的实现(Java)

文章仅作为自己学习的一个记录,欢迎交流学习经验,共同学习!有不当之处请指正批评!

下面的程序涉及到栈的基本操作,借助JAVA中的内置Stack实现,进入程序前,先就本实例中Stack的相关方法进行介绍:

  • push(int element):入栈操作,将element元素放入栈中。
  • pop():出栈操作,将当前栈顶元素取出(删除)并返回当前元素。
  • peek():获取当前栈顶元素,并返回当前元素的值,不删除栈顶元素。

实现获取栈中最小值的思路:

两个栈:

               主栈存放正常的数据元素;

               最小栈存放主栈中的当前最小值数据元素;

在出栈和入栈操作时,用最小栈中的栈顶元素和当前要入栈(或出栈)的元素进行比较,如果是最小值,就进行入栈或者出栈操作,否则最小栈不变。


当前程序说明:

主类:class MinStack

成员属性(Stack 类的对象):mainStack(主栈)    和     minStack(最小栈)

成员方法:

                   push(int element):入栈

                   pop():出栈

                   getMin():获取栈中最小值

import java.util.Stack;

public class MinStack {

	
	private Stack<Integer> mainStack=new Stack<Integer>();
	private Stack<Integer> minStack=new Stack<Integer>();
	
	//出栈操作  返回主栈mainStac.pop();
	//主栈直接出栈就可以,即mainStack.pop();
	//最小栈要跟主栈当前的出栈元素进行大小比较,如果当前主栈的出栈元素与最小栈中的栈顶元素相同,那最小栈minStack也调用minStack.pop(),即出栈操作
	public int pop() {
		
		if(mainStack.peek()==minStack.peek()) {
			minStack.pop();
		}
		
		return mainStack.pop();
	}
	
	
	//入栈操作   无返回值,直接将需要入栈的数据push进当前栈即可,即调用mainStack.push();
	//这里要判断最小栈minStack是否需要进行入栈操作,条件是当前入栈元素是否小于或者等于当前最小栈minStack中的栈顶元素,如果小于或者等于,那就也进行入栈操作,即minStack.push();
	public void push(int element) {
		mainStack.push(element);
		
		if(minStack.empty() || element<=minStack.peek()) {
			minStack.push(element);
		}
	}
	
	
	//获取主栈中的最小值,getMin()方法
	//取值前先判断一下主栈是否为空
	public int getMin()throws Exception {
		if(mainStack.empty()) {
			
			throw new Exception("mainStack is empty!!!!!");
			//System.out.println("mainStack is empty!!!!!");
			
		}
		
		return minStack.peek();
	}
	
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		
		MinStack stack=new MinStack();
		
		stack.push(10);
		stack.push(65);
		stack.push(3);
		stack.push(51);
		stack.push(90);
		stack.push(1);
		stack.push(80);
		stack.push(38);
		stack.push(73);
		
		System.out.println(stack.getMin());
		
		stack.pop();
		stack.pop();
		stack.pop();
		stack.pop();
		stack.pop();
		
		System.out.println(stack.getMin());
		

	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RSA算法是一种非对称加密算法,常用于数据加密和数字签名等。在前端使用js实现RSA算法加密,后端使用Java实现RSA算法解密,具体步骤如下: 前端(js)实现: 1. 生成RSA密钥对,代码如下: ```javascript function generateRSAKey() { var crypt = new JSEncrypt({ default_key_size: 1024 }); crypt.getKey(); return crypt; } ``` 2. 使用公钥加密数据,代码如下: ```javascript function encryptData(data, publicKey) { var crypt = new JSEncrypt(); crypt.setKey(publicKey); var encryptedData = crypt.encrypt(data); return encryptedData; } ``` 后端(Java)实现: 1. 使用私钥解密数据,代码如下: ```java public static String decryptData(String data, String privateKey) throws Exception { byte[] dataBytes = Base64.decodeBase64(data); byte[] keyBytes = Base64.decodeBase64(privateKey); PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateK); byte[] decryptedData = cipher.doFinal(dataBytes); return new String(decryptedData); } ``` 2. 生成RSA密钥对,代码如下: ```java public static Map<String, String> generateRSAKey() throws Exception { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(1024); KeyPair keyPair = keyPairGen.generateKeyPair(); RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); Map<String, String> keyMap = new HashMap<String, String>(); keyMap.put("publicKey", Base64.encodeBase64String(publicKey.getEncoded())); keyMap.put("privateKey", Base64.encodeBase64String(privateKey.getEncoded())); return keyMap; } ``` 注意:在前端和后端使用RSA算法加密和解密的时候,需要使用相同的密钥对(即公钥和私钥)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值