主頁 >  其他 > 資料結構與演算法-->>堆疊、波蘭運算式、逆波蘭運算式

資料結構與演算法-->>堆疊、波蘭運算式、逆波蘭運算式

2021-09-15 09:22:21 其他

一、堆疊的簡介及其基本操作

堆疊的介紹

1)堆疊的英文為(stack)

2)堆疊是一個先入后出(FILO-First In Last Out)的有序串列

3)堆疊(stack)是限制線性表中元素的插入和洗掉只能在線性表的同一端進行的一種特殊線性表,允許插入和洗掉的一端,為變化的一端,稱為堆疊頂(Top),另一端為固定的一端,稱為堆疊底(Bottom).

4)根據堆疊的定義可知,最先放入堆疊中元素在堆疊底,最后放入的元素在堆疊頂,而洗掉元素剛好相反,最后放入的元素最先洗掉,最先放入的元素最后洗掉

堆疊的應用場景

1)子程式的呼叫:在跳往子程式前,會先將下個指令的地址存入到堆疊中,直到子程式執行完后再將地址取出,以回到原來的程式中,

2)處理遞回呼叫:和子程式的呼叫類似,只是除了儲存下一個指令的地址外,也將引數、區域變數等資料存入堆疊中,

3)運算式的轉換[中綴運算式轉后綴運算式]與求值(實際解決),

4)二叉樹的呃遍歷,

5)圖形的深度優先(depth - first)搜索法,

陣列模擬堆疊

1)使用陣列來模擬堆疊

2)定義一個 top 來表示堆疊頂,初始化為 -1

3)入堆疊的操作,當有資料加入到堆疊時,top++;stack[top] = data;

4)出堆疊的操作,int value = stack[top];top--;return value

public class ArrayStackDemo {
	public static void main(String[] args) {
		// 測驗一下ArrayStack是否正確
		// 先創建一個ArrayStack物件->表示堆疊
		ArrayStack stack = new ArrayStack(4);
		String key = "";
		boolean loop = true;// 控制是否退出選單
		Scanner scanner = new Scanner(System.in);
		while (loop) {
			System.out.println("show: 表示顯示堆疊");
			System.out.println("exit: 退出程式");
			System.out.println("push: 表示添加資料到堆疊(入堆疊)");
			System.out.println("pop: 表示從堆疊取出資料(出堆疊)");
			System.out.println("請輸入你的選擇");
			key = scanner.next();
			switch (key) {
			case "show":
				stack.list();
				break;
			case "push":
				System.out.println("請輸入一個數");
				int value = scanner.nextInt();
				stack.push(value);
				break;
			case "pop":
				try {
					int res = stack.pop();
					System.out.printf("出堆疊的資料是%d\n", res);
				} catch (Exception e) {
					System.out.println(e.getMessage());
				}
				break;
			case "exit":
				scanner.close();
				loop = false;
				break;
			default:
				break;
			}
		}
		System.out.println("程式退出~~");
	}
}
//定義一個ArrayStack表示堆疊
class ArrayStack {
	private int maxSize;// 堆疊的大小
	private int[] stack;// 陣列,陣列模擬堆疊,資料就放在該陣列
	private int top = -1;// top表示堆疊頂,初始化為-1
	// 構造器
	public ArrayStack(int maxSize) {
		this.maxSize = maxSize;
		stack = new int[this.maxSize];
	}
	// 堆疊滿
	public boolean isFull() {
		return top == maxSize - 1;
	}
	// 堆疊空
	public boolean isEmpty() {
		return top == -1;
	}
	// 入堆疊-push
	public void push(int value) {
		// 先判斷堆疊是否滿
		if (isFull()) {
			System.out.println("堆疊滿");
			return;
		}
		top++;
		stack[top] = value;
	}
	// 出堆疊-pop,將堆疊頂的資料回傳
	public int pop() {
		// 先判斷堆疊是否空
		if (isEmpty()) {
			// 拋出例外
			throw new RuntimeException("堆疊空,沒有資料~~");
		}
		int value = stack[top];
		top--;
		return value;
	}
	// 顯示堆疊的情況[遍歷堆疊],遍歷時,需要從堆疊頂開始顯示資料
	public void list() {
		if (isEmpty()) {
			System.out.println("堆疊空,沒有資料~~");
			return;
		}
		// 需要從堆疊頂開始顯示資料
		for (int i = top; i >= 0; i--) {
			System.out.printf("stack[%d]=%d\n", i, stack[i]);
		}
	}
}

堆疊實作綜合計算器【中綴運算式】

1.通過一個index值(索引),來遍歷運算式

2.如果發現是一個數字,就直接入數堆疊

3.如果發現掃描到是一個符號,就分如下情況

3.1 如果發現當前的符號堆疊為空,就直接入堆疊

3.2 如果符號堆疊有運算子,就進行比較,如果當前的運算子的優先級小于或者等于堆疊中的運算子,就需要從數堆疊中pop出兩個數,再從符號堆疊中pop出一個符號,進行運算,將得到結果,入數堆疊,然后將當前的運算子入符號堆疊,如果當前的運算子的優先級大于戰中的運算子,就直接入符號堆疊

4.當運算式掃描完畢,就順序的從數堆疊和符號堆疊中pop出相應的數和符號,并運行,

5.最后在數堆疊只有一個數字,就是運算式的結果

public class Calculator {
	public static void main(String[] args) {
		// 根據前面老師思路,完成運算式的運算
		String expression = "7*2*2-5+1-5+3-4";
		// 創建兩個堆疊,數堆疊,一個符號堆疊
		ArrayStack2 numStack = new ArrayStack2(10);
		ArrayStack2 operStack = new ArrayStack2(10);
		// 定義需要的相關變數
		int index = 0;// 用于掃描
		int num1 = 0;
		int num2 = 0;
		int oper = 0;
		int res = 0;
		char ch = ' ';// 將每次掃描得到char保存到ch
		String keepNum = "";// 用于拼接多位數
		// 開始while回圈的掃描expression
		while (true) {
			// 依次得到expression的每一個字符
			ch = expression.substring(index, index + 1).charAt(0);
			// 判斷ch是什么,然后做出相應的處理
			if (operStack.isOper(ch)) {// 如果是運算子
				// 判斷當前的符號堆疊是否為空
				if (!(operStack.isEmpty())) {
					// 如果符號堆疊有運算子,就進行比較,如果當前的運算子的優先級小于或者等于堆疊中的運算子,就需要從數堆疊
					// 中pop出兩個數,再從符號堆疊中pop出一個符號,進行運算,將得到結果,入數堆疊,然后將當前的運算子
					// 入符號堆疊
					if (operStack.priority(ch) <= operStack.priority(operStack.peek())) {
						num1 = numStack.pop();
						num2 = numStack.pop();
						oper = operStack.pop();
						res = numStack.cal(num1, num2, oper);
						// 把運算的結構入數堆疊
						numStack.push(res);
						// 然后把當前的運算子入符號堆疊
						operStack.push(ch);
					} else {
						// 如果當前的運算子的優先級大于堆疊中的運算子,就直接入符號堆疊,
						operStack.push(ch);
					}
				} else {
					// 如果為空直接入符號堆疊
					operStack.push(ch);
				}
			} else {// 如果是數,則直接入數堆疊
//				numStack.push(ch - 48);// 掃描到的運算式是'1',需要轉為數字1//這樣不能處理多位數,改進
				// 分析思路
				// 1.當處理多位數時,不能發現 時一個數就立即入堆疊,因為它 可能是多位數
				// 2.在處理數,需要向expression的運算式的index后再看一位,如果是數就進行掃描,如果是符號才入堆疊
				// 3.因此需要定義一個變數 字串,用于拼接
				// 處理多位數
				keepNum += ch;
				// 如果ch已經是expression的最后一位,就直接入堆疊
				if (index == expression.length() - 1) {
					numStack.push(Integer.parseInt(keepNum));
				} else {
					// 判斷下一個字符是不是數字,如果是數字,就繼續掃描,如果是運算子,則入堆疊
					// 注意是看后一位,不是index++
					if (operStack.isOper(expression.substring(index + 1, index + 2).charAt(0))) {
						// 如果后一位是運算子,則入堆疊keepNum = "1" 或者 "123"
						numStack.push(Integer.parseInt(keepNum));
						// 重要的!!!!,keepNum清空
						keepNum = "";
					}
				}
			}
			// 讓index + 1,并判斷是否掃描到expression最后,
			index++;
			if (index >= expression.length()) {
				break;
			}
		}
		// 當運算式掃描完畢,就順序的從數堆疊和符號堆疊中pop出相應的數和符號,并運行
		while (true) {
			// 如果符號堆疊為空,則計算到最后的結果,數堆疊中只有一個數字【結果】
			if (operStack.isEmpty()) {
				break;
			}
			num1 = numStack.pop();
			num2 = numStack.pop();
			oper = operStack.pop();
			res = numStack.cal(num1, num2, oper);
			numStack.push(res);// 入堆疊
		}
		// 將數堆疊的最后數,pop出,就是結果
		int res2 = numStack.pop();
		System.out.printf("運算式 %s = %d", expression, res2);
	}
}
//先創建一個堆疊,直接使用前面的
//定義一個ArrayStack2表示堆疊,需要擴展功能
class ArrayStack2 {
	private int maxSize;// 堆疊的大小
	private int[] stack;// 陣列,陣列模擬堆疊,資料就放在該陣列
	private int top = -1;// top表示堆疊頂,初始化為-1
	// 構造器
	public ArrayStack2(int maxSize) {
		this.maxSize = maxSize;
		stack = new int[this.maxSize];
	}
	// 增加一個方法,可以回傳當前堆疊頂的值,但是不是真正的pop
	public int peek() {
		return stack[top];
	}
	// 堆疊滿
	public boolean isFull() {
		return top == maxSize - 1;
	}
	// 堆疊空
	public boolean isEmpty() {
		return top == -1;
	}
	// 入堆疊-push
	public void push(int value) {
		// 先判斷堆疊是否滿
		if (isFull()) {
			System.out.println("堆疊滿");
			return;
		}
		top++;
		stack[top] = value;
	}
	// 出堆疊-pop,將堆疊頂的資料回傳
	public int pop() {
		// 先判斷堆疊是否空
		if (isEmpty()) {
			// 拋出例外
			throw new RuntimeException("堆疊空,沒有資料~~");
		}
		int value = stack[top];
		top--;
		return value;
	}
	// 顯示堆疊的情況[遍歷堆疊],遍歷時,需要從堆疊頂開始顯示資料
	public void list() {
		if (isEmpty()) {
			System.out.println("堆疊空,沒有資料~~");
			return;
		}
		// 需要從堆疊頂開始顯示資料
		for (int i = top; i >= 0; i--) {
			System.out.printf("stack[%d]=%d\n", i, stack[i]);
		}
	}
	// 回傳運算子的優先級,優先級時程式員來確定,優先級使用數字表示
	// 數字越大,則優先級就越高
	public int priority(int oper) {
		if (oper == '*' || oper == '/') {
			return 1;
		} else if (oper == '+' || oper == '-') {
			return 0;
		} else {
			return -1;// 假定目前的運算式只有+,-,*,/
		}
	}
	// 判斷是不是一個運算子
	public boolean isOper(char val) {
		return val == '+' || val == '-' || val == '*' || val == '/';
	}
	// 計算方法
	public int cal(int num1, int num2, int oper) {
		int res = 0;// res用于存放計算的結果
		switch (oper) {
		case '+':
			res = num1 + num2;
			break;
		case '-':
			res = num2 - num1;
			break;
		case '*':
			res = num1 * num2;
			break;
		case '/':
			res = num2 / num1;
			break;
		default:
			break;
		}
		return res;
	}
}

二、前綴(波蘭運算式)、中綴、后綴運算式(逆波蘭運算式)

前綴運算式

1)前綴運算式又稱波蘭式,前綴運算式的運算子位于運算元之前

2)舉例說明:(3 + 4)*5 - 6對應的前綴運算式就是 - * + 3 4 5 6

中綴運算式

后綴運算式

逆波蘭計算器

1)輸入一個逆波蘭運算式,使用堆疊(Stack),計算其結果

2)支持小括號和多位數整數

中綴運算式轉為后綴運算式

逆波蘭計算器代碼:使用到了中綴運算式轉后綴運算式

public class PolandNotation {
	public static void main(String[] args) {
		// 完成將一個中綴運算式轉成后綴運算式的功能
		// 說明
		// 1. 1+((2+3)*4)-5 => 1 2 3 + 4 * + 5 -
		// 2. 因為直接對str進行操作,不方便,因此先將"1+((2+3)*4)-5" => 中綴的運算式對應的List
		// 即"1+((2+3)*4)-5" => ArrayList [1,+,(,(,2,+,3,),*,4,),-,5]
		// 3.將得到的中綴運算式對應的List => 后綴運算式對應的List
		// 即ArrayList[1, +, (, (, 2, +, 3, ), *, 4, ), -, 5] => [1,2,3,+,4,*,+,5,-]

		String expression = "1+((2+3)*4)-5";
		List<String> infixExpressionList = toInfixExpressionList(expression);
		System.out.println(infixExpressionList);// [1, +, (, (, 2, +, 3, ), *, 4, ), -, 5]
		List<String> suffixExpressionList = parseSuffixExpressionList(infixExpressionList);
		System.out.println("后綴運算式對應的List" + suffixExpressionList);
		System.out.printf("expression=%d", calculate(suffixExpressionList));
		/*
		 * // 先定義一個逆波蘭運算式 // (3 + 4) * 5 - 6 => 3 4 + 5 * 6 - //
		 * 說明:為了方便,逆波蘭運算式的數字和符號使用空格隔開 String suffixExcepression = "3 4 + 5 * 6 -"; // 思路
		 * // 1.先將"3 4 + 5 * 6 - " => 放到ArrayList中 //
		 * 2.將ArrayList傳遞給一個方法,遍歷ArrayList配合堆疊完成計算 List<String> list =
		 * getListString(suffixExcepression); System.out.println("rpnList=" + list); int
		 * res = calculate(list); System.out.println("計算的結果是=" + res);
		 */
	}
	// 方法:將中綴運算式轉成對應的List
	// s="1+((2+3)*4)-5";
	public static List<String> toInfixExpressionList(String s) {
		// 定義一個List,存放中綴運算式對應的內容
		List<String> ls = new ArrayList<String>();
		int i = 0;// 這是一個指標,用于遍歷中綴運算式字串
		String str;// 對多位數的拼接
		char c;// 每遍歷到一個字符,就放入到c
		do {
			// 如果c是一個非數字,就需要加入到ls
			if ((c = s.charAt(i)) < 48 || (c = s.charAt(i)) < 57) {
				ls.add("" + c);
				i++;// i需要后移
			} else {// 如果是一個數,需要考慮多位數
				str = "";// 先將str置成"" '0'[48] -> '9'[57]
				while (i < s.length() && (c = s.charAt(i)) >= 48 && (c = s.charAt(i)) < 57) {
					str += c;// 拼接
					i++;
				}
				ls.add(str);
			}
		} while (i < s.length());
		return ls;// 回傳
	}
	// 方法:將得到的中綴運算式對應的List => 后綴運算式對應的List
	public static List<String> parseSuffixExpressionList(List<String> ls) {
		// 定義兩個堆疊
		Stack<String> s1 = new Stack<String>();// 符號堆疊
		// 說明:因為s2這個堆疊,在整個轉換程序中,沒有pop操作,而且后面我們還需要逆序輸出
		// 因此比較麻煩,這里我們就不用Stack<String> 直接使用List<String> s2
		// Stack<String> s2 = new Stack<String>();//儲存有中間結果的堆疊s2
		List<String> s2 = new ArrayList<String>();// 儲存中間結果的List s2
		// 遍歷ls
		for (String item : ls) {
			// 如果是一個數,加入s2
			if (item.matches("\\d+")) {
				s2.add(item);
			} else if (item.equals("(")) {
				s1.push(item);
			} else if (item.equals(")")) {
				// 如果是右括號")",則依次彈出s1堆疊頂的運算子,并壓入s2,直到遇到左括號為止,此時將這一對括號去掉
				while (!s1.peek().equals("(")) {
					s2.add(s1.pop());
				}
				s1.pop();// !!!!將 ( 彈出s1堆疊,消除小括號
			} else {
				// 當item的優先級小于等于s1堆疊頂運算子,將s1堆疊頂的運算子彈出并加入到s2中,再次轉到(4.1)與s1中新的堆疊頂運算子相比較
				// 問題:缺少一個比較優先級高低的方法
				while (s1.size() != 0 && Operation.getValue(s1.peek()) >= Operation.getValue(item)) {
					s2.add(s1.pop());
				}
				// 還需要將item壓入堆疊
				s1.push(item);
			}
		}
		// 將s1中剩余的運算子依次彈出并加入s2
		while (s1.size() != 0) {
			s2.add(s1.pop());
		}
		return s2;// 注意因為是存放到List,因此按順序輸出就是對應的后綴運算式對應的List
	}
	// 將一個逆波蘭運算式,依次將資料和運算子放入到ArrayList中
	public static List<String> getListString(String suffixExcepression) {
		// 將suffixExcepression分割
		String[] split = suffixExcepression.split(" ");
		List<String> list = new ArrayList<String>();
		for (String ele : split) {
			list.add(ele);
		}
		return list;
	}
	// 完成對逆波蘭運算式的運算
	/*
	 * 1)從左至右掃描,將3和4壓入堆疊 2)遇到 + 運算子,因此彈出4和3(4為堆疊頂元素,3為次頂元素),計算出3+4的值,得7,再將7入堆疊 3)將5入堆疊
	 * 4)接下來是*運算子,因此彈出5和7,計算出7*5=35,將35入堆疊 5)將6入堆疊 6)最后是-運算子,計算出35-6得知,即29,由此得出最終結果
	 */
	public static int calculate(List<String> ls) {
		// 創建一個堆疊,只需要一個堆疊即可
		Stack<String> stack = new Stack<String>();
		// 遍歷 ls
		for (String item : ls) {
			// 這里使用正則運算式來取出數
			if (item.matches("\\d+")) {// 匹配的是多位數
				// 入堆疊
				stack.push(item);
			} else {
				// pop出兩個數,并運算,再入堆疊
				// 注意接收num的數值順序與后面運算時num的順序要對應,否則結果會出錯
				int num2 = Integer.parseInt(stack.pop());
				int num1 = Integer.parseInt(stack.pop());
				int res = 0;
				if (item.equals("+")) {
					res = num1 + num2;
				} else if (item.equals("-")) {
					res = num1 - num2;
				} else if (item.equals("*")) {
					res = num1 * num2;
				} else if (item.equals("/")) {
					res = num1 / num2;
				} else {
					throw new RuntimeException("運算子有誤");
				}
				// 把res入堆疊
				stack.push("" + res);
			}
		}
		// 最后留在stack中的資料是運算結果
		return Integer.parseInt(stack.pop());
	}
}
//撰寫一個類Operation可以回傳一個運算子對應的優先級
class Operation {
	private static int ADD = 1;
	private static int SUB = 1;
	private static int MUL = 2;
	private static int DIV = 2;

	// 寫一個方法,回傳對應的優先級數字
	public static int getValue(String operation) {
		int result = 0;
		switch (operation) {
		case "+":
			result = ADD;
			break;
		case "-":
			result = SUB;
			break;
		case "*":
			result = MUL;
			break;
		case "/":
			result = DIV;
			break;
		default:
			System.out.println("不存在該運算子");
			break;
		}
		return result;
	}
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300245.html

標籤:其他

上一篇:[資料結構]單鏈表各種操作的代碼實作

下一篇:蘋果 M1“痛失”Windows 11!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more