单链表

todo AcWing 826. 单链表

双链表

todo AcWing 827. 双链表

AcWing 828. 模拟栈

package main

import (
	"bufio" // io
	"fmt"
	"os" // io
)

func _debug() {
	stk := []int{}

	n := ri()

	for i := 0; i < n; i++ {
		op := string(rs())

		if op == "push" {
			x := ri()
			stk = append(stk, x)
		} else if op == "pop" {
			stk = stk[:len(stk)-1]
		} else if op == "empty" {
			if len(stk) != 0 {
				fmt.Fprintln(out, "NO")
			} else {
				fmt.Fprintln(out, "YES")
			}
		} else if op == "query" {
			fmt.Fprintln(out, stk[len(stk)-1])
		}
	}
}

// ===== ===== fast io ===== =====
// golang fast io from 0x3F <https://github.com/EndlessCheng/codeforces-go/>

const eof = 0

var (
	in  *bufio.Scanner
	out *bufio.Writer

	_i, _n, buf = 0, 0, make([]byte, 1<<12) // 4KB
)

// 读一个仅包含小写字母的字符串
func rs() (s []byte) {
	b := rc()
	for ; 'a' > b || b > 'z'; b = rc() { // 'A' 'Z'
	}
	for ; 'a' <= b && b <= 'z'; b = rc() { // 'A' 'Z'
		s = append(s, b)
	}
	return
}

func rc() byte { // faster read one byte
	if _i == _n {
		_n, _ = os.Stdin.Read(buf)
		if _n == 0 { // EOF
			return eof
		}
		_i = 0
	}
	b := buf[_i]
	_i++
	return b
}

// suggest
func ri() (x int) { // faster read int, support negative
	neg := false
	b := rc()
	for ; '0' > b || b > '9'; b = rc() {
		// 某些多组数据的题目,不告诉有多少组数据,那么需要额外判断是否读到了 EOF
		if b == eof {
			return
		}
		if b == '-' {
			neg = true
		}
	}
	for ; '0' <= b && b <= '9'; b = rc() {
		x = x*10 + int(b&15)
	}
	if neg {
		return -x
	}
	return
}

// ===== ===== fast io ===== =====

func main() {
	// ===== ===== fast io ===== =====
	in = bufio.NewScanner(os.Stdin)
	// in.Split(bufio.ScanWords) // 分割
	out = bufio.NewWriter(os.Stdout)
	defer out.Flush()
	// ===== ===== fast io ===== =====
	_debug()
}

AcWing 3302. 表达式求值

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func _debug() {
	var s string
	fmt.Fscan(in, &s)

	fmt.Fprintln(out, backCalc(mid2back(s)))
}

// 中缀转后缀
func mid2back(s string) []string {
	priority := func(x byte) int {
		if x == '*' || x == '/' {
			return 2
		} else if x == '+' || x == '-' {
			return 1
		}
		return 0
	}

	stk := []byte{}
	ans := []string{}
	for i := 0; i < len(s); i++ {
		if s[i] >= '0' && s[i] <= '9' { // 数字直接输出 处理多位数字
			var j int
			for j = i; j < len(s) && s[j] >= '0' && s[j] <= '9'; j++ {
			}
			ans = append(ans, s[i:j])
			i = j - 1
		} else if s[i] == '(' {
			stk = append(stk, s[i])
		} else if s[i] == ')' {
			for len(stk) > 0 && stk[len(stk)-1] != '(' {
				ans = append(ans, string(stk[len(stk)-1]))
				stk = stk[:len(stk)-1]
			}
			stk = stk[:len(stk)-1]
		} else { // 运算符 要判断优先级
			// 只要栈顶 符号的优先级不低于新符号,就不断取出栈顶并输出
			for len(stk) > 0 && priority(stk[len(stk)-1]) >= priority(s[i]) {
				ans = append(ans, string(stk[len(stk)-1]))
				stk = stk[:len(stk)-1]
			}
			stk = append(stk, s[i])
		}
	}
	for len(stk) > 0 {
		ans = append(ans, string(stk[len(stk)-1]))
		stk = stk[:len(stk)-1]
	}
	return ans
}

// 后缀计算
func backCalc(s []string) (ans int) {
	op := func(b, a int, x string) int {
		if x == "+" {
			return b + a
		} else if x == "-" {
			return b - a
		} else if x == "*" {
			return b * a
		} else if x == "/" {
			return b / a
		}
		return -1 << 31
	}

	stk := []int{}
	for _, x := range s {
		if x == "+" || x == "-" || x == "*" || x == "/" {
			a := stk[len(stk)-1]
			b := stk[len(stk)-2]
			stk = stk[:len(stk)-2]
			stk = append(stk, op(b, a, x))
		} else {
			ii, _ := strconv.Atoi(x)
			stk = append(stk, ii)
		}
	}
	return stk[0] // 最后肯定只剩一个
}

// ===== ===== fast io ===== =====
// golang fast io from 0x3F <https://github.com/EndlessCheng/codeforces-go/>

var (
	in *bufio.Reader
	out *bufio.Writer
)

func main() {
	in = bufio.NewReader(os.Stdin) // 搭配Fscan使用
	out = bufio.NewWriter(os.Stdout)
	defer out.Flush()
	// ===== ===== fast io ===== =====
	_debug()
}

队列

AcWing 829. 模拟队列

package main

import (
	"bufio" // io
	"fmt"
	"os" // io
)

func _debug() {
	queue := []int{}

	n := ri()

	for i := 0; i < n; i++ {
		op := string(rs())

		if op == "push" {
			x := ri()
			queue = append(queue, x)
		} else if op == "pop" {
			queue = queue[1:]
		} else if op == "empty" {
			if len(queue) != 0 {
				fmt.Fprintln(out, "NO")
			} else {
				fmt.Fprintln(out, "YES")
			}
		} else if op == "query" {
			fmt.Fprintln(out, queue[0])
		}
	}
}

// ===== ===== fast io ===== =====
// golang fast io from 0x3F <https://github.com/EndlessCheng/codeforces-go/>
const eof = 0

var (
	out *bufio.Writer

	_i, _n, buf = 0, 0, make([]byte, 1<<12) // 4KB
)

func rc() byte { // faster read one byte
	if _i == _n {
		_n, _ = os.Stdin.Read(buf)
		if _n == 0 { // EOF
			return eof
		}
		_i = 0
	}
	b := buf[_i]
	_i++
	return b
}

// 读一个仅包含小写字母的字符串,必要时进行修改
func rs() (s []byte) {
	b := rc()
	for ; 'a' > b || b > 'z'; b = rc() { // 'A' 'Z'
	}
	for ; 'a' <= b && b <= 'z'; b = rc() { // 'A' 'Z'
		s = append(s, b)
	}
	return
}

// suggest
func ri() (x int) { // faster read int, support negative
	neg := false
	b := rc()
	for ; '0' > b || b > '9'; b = rc() {
		// 某些多组数据的题目,不告诉有多少组数据,那么需要额外判断是否读到了 EOF
		if b == eof {
			return
		}
		if b == '-' {
			neg = true
		}
	}
	for ; '0' <= b && b <= '9'; b = rc() {
		x = x*10 + int(b&15)
	}
	if neg {
		return -x
	}
	return
}

func main() {
	// ===== ===== fast io ===== =====
	out = bufio.NewWriter(os.Stdout)
	defer out.Flush()
	// ===== ===== fast io ===== =====
	_debug()
}

单调栈

AcWing 830. 单调栈

package main

import (
	"bufio"
	"fmt"
	"os"
)

func _debug() {
	stk := []int{}
	n := ri()
	nums := make([]int, n)

	for i := range nums {
		nums[i] = ri()
	}

	for _, x := range nums {
		for len(stk) > 0 && stk[len(stk)-1] >= x {
			stk = stk[:len(stk)-1]
		}
		if len(stk) == 0 {
			fmt.Fprint(out, -1, " ")
		} else {
			fmt.Fprint(out, stk[len(stk)-1], " ")
		}
		stk = append(stk, x)
	}
}

// ===== ===== fast io ===== =====
// golang fast io from 0x3F <https://github.com/EndlessCheng/codeforces-go/>

const eof = 0

var (
	// in  *bufio.Scanner
	out *bufio.Writer

	_i, _n, buf = 0, 0, make([]byte, 1<<12) // 4KB
)

func rc() byte { // faster read one byte
	if _i == _n {
		_n, _ = os.Stdin.Read(buf)
		if _n == 0 { // EOF
			return eof
		}
		_i = 0
	}
	b := buf[_i]
	_i++
	return b
}

// 读一个仅包含小写/大写字母的字符串,必要时进行修改
func rs() (s []byte) {
	b := rc()
	for ; 'A' > b || b > 'Z'; b = rc() { // 'A' 'Z'	// 把非必要字符过滤掉
	}
	for ; 'A' <= b && b <= 'Z'; b = rc() { // 'A' 'Z'
		s = append(s, b)
	}
	return
}

// 读一个长度为 n 的仅包含小写/大写字母的字符串,必要时进行修改
func rsn(n int) []byte {
	b := rc()
	// 只读取大小写字母和数字
	for ; !('a' <= b && b <= 'z') && !('A' <= b && b <= 'Z') && !('0' <= b && b <= '9'); b = rc() { // 'A' 'Z'
	}
	s := make([]byte, 0, n)
	s = append(s, b)
	for i := 1; i < n; i++ {
		s = append(s, rc())
	}
	return s
}

func ri() (x int) { // faster read int, support negative
	neg := false
	b := rc()
	for ; '0' > b || b > '9'; b = rc() {
		// 某些多组数据的题目,不告诉有多少组数据,那么需要额外判断是否读到了 EOF
		if b == eof {
			return
		}
		if b == '-' {
			neg = true
		}
	}
	for ; '0' <= b && b <= '9'; b = rc() {
		x = x*10 + int(b&15)
	}
	if neg {
		return -x
	}
	return
}

func main() {
	// ===== ===== fast io ===== =====
	out = bufio.NewWriter(os.Stdout)
	defer out.Flush()
	// ===== ===== fast io ===== =====
	_debug()
}

单调队列

AcWing 154. 滑动窗口

package main

import (
	"bufio"
	"fmt"
	"os"
)

func _debug() {
	n, k := ri(), ri()

	nums := make([]int, n)
	for i := range nums {
		nums[i] = ri()
	}

	q := []int{}
	mins := []int{}
	maxs := []int{}

	for i := 0; i < len(nums); i++ {
		for len(q) > 0 && nums[i] <= nums[q[len(q)-1]] {
			q = q[:len(q)-1]
		}
		q = append(q, i)
		left := i - k + 1
		for q[0] < left {
			q = q[1:]
		}
		if i >= k-1 {
			mins = append(mins, nums[q[0]])
		}
	}

	q = []int{}
	for i := 0; i < len(nums); i++ {
		for len(q) > 0 && nums[i] >= nums[q[len(q)-1]] {
			q = q[:len(q)-1]
		}
		q = append(q, i)
		left := i - k + 1
		for q[0] < left {
			q = q[1:]
		}
		if i >= k-1 {
			maxs = append(maxs, nums[q[0]])
		}
	}
	for _, x := range mins {
		fmt.Fprint(out, x, " ")
	}
	fmt.Fprintln(out)
	for _, x := range maxs {
		fmt.Fprint(out, x, " ")
	}
}

// ===== ===== fast io ===== =====
// golang fast io from 0x3F <https://github.com/EndlessCheng/codeforces-go/>

const eof = 0

var (
	out *bufio.Writer
	_i, _n, buf = 0, 0, make([]byte, 1<<12) // 4KB
)

func rc() byte { // faster read one byte
	if _i == _n {
		_n, _ = os.Stdin.Read(buf)
		if _n == 0 { // EOF
			return eof
		}
		_i = 0
	}
	b := buf[_i]
	_i++
	return b
}

// 读一个仅包含小写/大写字母的字符串,必要时进行修改
func rs() (s []byte) {
	b := rc()
	for ; 'A' > b || b > 'Z'; b = rc() { // 'A' 'Z'	// 把非必要字符过滤掉
	}
	for ; 'A' <= b && b <= 'Z'; b = rc() { // 'A' 'Z'
		s = append(s, b)
	}
	return
}

// 读一个长度为 n 的仅包含小写/大写字母的字符串,必要时进行修改
func rsn(n int) []byte {
	b := rc()
	// 只读取大小写字母和数字
	for ; !('a' <= b && b <= 'z') && !('A' <= b && b <= 'Z') && !('0' <= b && b <= '9'); b = rc() { // 'A' 'Z'
	}
	s := make([]byte, 0, n)
	s = append(s, b)
	for i := 1; i < n; i++ {
		s = append(s, rc())
	}
	return s
}

func ri() (x int) { // faster read int, support negative
	neg := false
	b := rc()
	for ; '0' > b || b > '9'; b = rc() {
		// 某些多组数据的题目,不告诉有多少组数据,那么需要额外判断是否读到了 EOF
		if b == eof {
			return
		}
		if b == '-' {
			neg = true
		}
	}
	for ; '0' <= b && b <= '9'; b = rc() {
		x = x*10 + int(b&15)
	}
	if neg {
		return -x
	}
	return
}

func main() {
	// ===== ===== fast io ===== =====
	out = bufio.NewWriter(os.Stdout)
	defer out.Flush()
	// ===== ===== fast io ===== =====
	_debug()
}