Valid_Parentheses

题目描述:Given a string containing just the characters '(', ')', '{', '}', '[' and ']',
                determine if the input string is valid.
                The brackets(括号)must close in the correct order,
                "()" and "()[]{}" are all valid but "(]" and "([)]" are not.
                译:给定一个字符串,包含字符"()","{}","[]",
                确定输入字串是否有效。
                括号必须以正确的顺序关闭,

                "()"、"()[]{}"均为有效,但"(]"和"([)]"不是.

public class Valid_Parentheses {
	public static boolean judge(char str1,char str2)
	{
		if(str1=='(')
			if(str2==')')
				return true;
		if(str1=='[')
			if(str2==']')
				return true;
		if(str1=='{')
			if(str2=='}')
				return true;
		return false;
	}
	public static boolean solve(String str)
	{
		Stack<Character> stack=new Stack<Character>();
		for(int i=0;i<str.length();i++)
		{
			char mid = str.charAt(i);
			if(mid=='('||mid=='['||mid=='{')
			{
				stack.push(mid);
			}
			if(mid==')'||mid==']'||mid=='}')
			{
				if(!stack.empty())
				{
					if(judge(stack.pop(),mid))
					{
						return true;
					}
				}
				else
				{
					return false;
				}
			}
		}
		return false;
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String str = sc.next(); 
		System.out.println(solve(str));
	}
}


#include <iostream> #include <cstring> #include <unordered_map> using namespace std; class SeqStack { private: char* stackArray; // 存储栈元素的动态数组 int top; // 栈顶指针(-1 表示空栈) int maxSize; // 栈的最大容量 public: // 构造函数:初始化栈 SeqStack(int size = 10) { // 给默认容量,避免传参失误 maxSize = size > 0? size : 10; stackArray = new (nothrow) char[maxSize]; if (stackArray == nullptr) { cerr << "内存分配失败!程序终止。" << endl; exit(EXIT_FAILURE); } top = -1; } // 析构函数:释放内存 ~SeqStack() { delete[] stackArray; } // 入栈操作(支持动态扩容) void push(char elem) { if (isFull()) { // 扩容为原来的 2 倍,最少扩容到 10(避免容量为 0) int newSize = max(maxSize * 2, 10); char* newArray = new (nothrow) char[newSize]; if (newArray == nullptr) { cerr << "扩容失败!内存不足。" << endl; return; } // 拷贝旧数据 for (int i = 0; i <= top; i++) { newArray[i] = stackArray[i]; } // 释放旧内存,替换为新数组 delete[] stackArray; stackArray = newArray; maxSize = newSize; } stackArray[++top] = elem; } // 出栈操作(返回栈顶元素,失败返回 '\0') char pop() { if (isEmpty()) { return '\0'; } return stackArray[top--]; } // 获取栈顶元素(不弹出,失败返回 '\0') char getTop() { if (isEmpty()) { return '\0'; } return stackArray[top]; } // 判断栈是否为空 bool isEmpty() { return top == -1; } // 判断栈是否已满(扩容后一般用不到,但保留接口) bool isFull() { return top == maxSize - 1; } }; // 括号匹配函数:返回 true 表示匹配成功,失败时输出具体原因 bool is_valid_parentheses(const string& s, string& errorMsg) { SeqStack stack(s.size()); // 扩展映射表,支持中文括号(按需调整) unordered_map<char, char> mapping = { {')', '('}, {']', '['}, {'}', '{'}, {')', '('}, {']', '['}, {'}', '{'} }; for (char c : s) { // 检查字符是否为括号(包括中文括号) auto it = mapping.find(c); if (it == mapping.end()) { // 不是括号,跳过 continue; } if (c == ')' || c == ']' || c == '}' || c == ')' || c == ']' || c == '}') { // 遇到右括号:检查匹配 if (stack.isEmpty()) { errorMsg = "右括号多余或顺序错误(空栈遇到右括号)"; return false; } char top_char = stack.pop(); if (top_char != mapping[c]) { errorMsg = "括号类型不匹配(右括号与栈顶左括号不对应)"; return false; } } else { // 遇到左括号:入栈 stack.push(c); } } // 遍历结束后检查栈状态 if (!stack.isEmpty()) { errorMsg = "左括号多余(存在未匹配的左括号)"; return false; } errorMsg = "括号匹配成功"; return true; } // 测试函数 int main() { string testCases[] = { "()", // 有效 "()[]{}", // 有效 "(]", // 无效:类型不匹配 "([)]", // 无效:嵌套错误 "{[]}", // 有效 "", // 有效(空字符串) "(", // 无效:左括号多余 ")", // 无效:右括号多余 "a(b[c]d)", // 有效(过滤非括号字符) "()", // 有效(中文括号) "(]", // 无效(中文括号不匹配) }; int caseCount = sizeof(testCases) / sizeof(testCases[0]); for (int i = 0; i < caseCount; i++) { string errorMsg; bool result = is_valid_parentheses(testCases[i], errorMsg); cout << "字符串:\"" << testCases[i] << "\"\n"; cout << "结果:" << (result? "有效" : "无效") << ",原因:" << errorMsg << "\n\n"; } return 0; }
最新发布
07-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值