leecode: 150. 逆波兰表达式求值

leecode: 150. 逆波兰表达式求值

根据 逆波兰表示法,求表达式的值。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

注意 两个整数之间的除法只保留整数部分。
可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

在这里插入图片描述
注意:
逆波兰表达式:也是后缀表达式
在这里插入图片描述
思路:
这里可以这么考虑:字符串数组中可以分为两类:数字字符串和运算符字符串。用栈来解决(因为栈的特性后进先出,比如:遇到运算符直接弹出紧挨着两个数字),遇数字入栈,遇运算符弹出2个数字来进行运算

class Solution {
    public int evalRPN(String[] tokens) {
	    //定义栈
	    Stack<Integer> stack = new Stack<>();
	    //遍历字符串数组
	    for(int i=0; i<tokens.length; i++){
	    	String s = tokens[i];
	    	//此时s可以是数字也可以是+、-、*、/运算符,而且处理方式不同,可以用iflese,但感觉用switch会更好
	    	int o1;
            int o2;
            Integer o;
	    	switch(s){
	    		case "+":
	    			//弹出2个操作数
	    			o1 = stack.pop();
	    			o2 = stack.pop();
	    			o = o2 + o1; // 先进后出,所以o2是在前面
	    			stack.push(o); // 将结果入栈
	    			break;
	    		case "-":
	    			//弹出2个操作数
	    			o1 = stack.pop();
	    			o2 = stack.pop();
	    			o = o2 - o1; // 先进后出,所以o2是在前面
	    			stack.push(o); // 将结果入栈
	    			break;
	    		case "*":
	    			//弹出2个操作数
	    			o1 = stack.pop();
	    			o2 = stack.pop();
	    			o = o2 * o1; // 先进后出,所以o2是在前面
	    			stack.push(o); // 将结果入栈
	    			break;
				case "/":
					//弹出2个操作数
	    			o1 = stack.pop();
	    			o2 = stack.pop();
	    			o = o2 / o1; // 先进后出,所以o2是在前面
	    			stack.push(o); // 将结果入栈
	    			break;
	    		default:
	    			//说明此时s为数字字符串
	    			stack.push(Integer.valueOf(s));
	    	}
	    }
		return stack.pop();
    }
}

总结:
1、我第一次用的是ifelse来写的,但是时间复杂度更高,且更消耗内存,所以,后面还是用switch语句
2、我在用switch时,定义的3个变量写在了switch里面,发现报错:在switch里不能重复定义一个变量,表明整个switch内是一个代码块,而非每个case都是一个代码块。
继续加油

你提供的代码中存在 **多个问题**,包括: 1. `from Leecode100.链表.合并两个有序链表 import LinkNode` 与你自己定义的 `LinkNode` 类冲突。 2. `print(list_to_link(merged_head))` 错误地调用了 `list_to_link`,它应该是 `link_to_arry`。 3. 你自定义的 `LinkNode` 类名和导入的可能冲突,建议统一命名。 4. `LinkNode` 应该命名为 `ListNode`,与 LeetCode 保持一致(虽然不是必须,但有助于调试)。 --- ## ✅ 修复后的完整代码如下: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def mergeTwoLists(l1: ListNode, l2: ListNode) -> ListNode: dummy = ListNode(-1) current = dummy while l1 and l2: if l1.val < l2.val: current.next = l1 l1 = l1.next else: current.next = l2 l2 = l2.next current = current.next if l1: current.next = l1 else: current.next = l2 return dummy.next def mergeKLists(lists): if not lists: return None if len(lists) == 1: return lists[0] mid = len(lists) // 2 left = mergeKLists(lists[:mid]) right = mergeKLists(lists[mid:]) return mergeTwoLists(left, right) def list_to_link(lst): if not lst: return None dummy = ListNode(-1) current = dummy for val in lst: current.next = ListNode(val) current = current.next return dummy.next def link_to_array(head): result = [] while head: result.append(head.val) head = head.next return result if __name__ == '__main__': # 测试 lists = [[1, 4, 5], [1, 3, 4], [2, 6]] linked_lists = [list_to_link(lst) for lst in lists] merged_head = mergeKLists(linked_lists) print(link_to_array(merged_head)) # 输出: [1, 1, 2, 3, 4, 4, 5, 6] ``` --- ## 🔍 错误分析与修复说明: ### ❌ 错误 1:类名重复或冲突 你导入了一个 `LinkNode`,又定义了一个 `LinkNode`,这会导致命名冲突。 ✅ **修复:删除导入语句,并使用统一的 `ListNode` 类名。** --- ### ❌ 错误 2:调用 `list_to_link` 打印结果 ```python print(list_to_link(merged_head)) ``` 这个写法是错误的,因为 `merged_head` 是一个链表头节点,而 `list_to_link` 是将列表转成链表。 ✅ **修复:使用 `link_to_array(merged_head)` 把链表转成列表再打印。** --- ### ❌ 错误 3:函数命名不规范 你写的是 `merger_two_list`,但应该命名为 `mergeTwoLists`,更清晰、更标准。 ✅ **修复:函数名统一为 `mergeTwoLists`。** --- ## ✅ 最终输出结果: ``` [1, 1, 2, 3, 4, 4, 5, 6] ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值