C++与Java之括号匹配(栈实现)

本文介绍了一个用于检测字符串中括号是否正确匹配的算法,并提供了C++和Java两种语言的实现代码。该算法使用栈来跟踪左括号并验证每个右括号是否有相应的左括号与之配对。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注。

输入

输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。

输出

对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"$","?"和空格组成,"$"和"?"表示与之对应的左括号和右括号不能匹配。


C++代码如下:

#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main()
{

		string a, str;
		while (cin>>a) {
			int k = -1;
		str = a;
		for (int i = 0; i < a.length(); i++)
			cout << a[i];
		cout << endl;
		for (int i = 0; i < a.length(); i++)
			str[i] = ' ';
		stack<int>b;
		for (int i = 0; i < a.length(); i++)
		{
			if (a[i] == '(')
			{
				b.push(i);
			}
			else if (a[i] == ')')
			{
				if (b.empty())
				{
					k = i;
					str[i] = '?';
				}
				else
				{
					b.pop();
				}
			}
		}
			int counts = b.size();
			for (int i = 0; i < counts; i++)
			{
				str[b.top()] = '$';
				b.pop();
			}
			for (int i = 0; i < str.length(); i++)
				cout << str[i];
			cout << endl;
	}
	system("pause");
}


Java代码如下:

package kuohao;
import java.util.Scanner;
import java.util.Stack;
import java.util.ArrayList;
public class Main {
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		String a=new String();
		while(true)
		{
			Stack<Character> b=new Stack<Character>();
			if(sc.hasNextLine())
			{
				a=sc.nextLine();
			}
			else
			{
				break;
			}
			System.out.println(a);
			ArrayList<Integer> left=new ArrayList<Integer>();
			ArrayList<Integer> right=new ArrayList<Integer>();
			ArrayList<Character> result=new ArrayList<Character>();
			for(int i=0;i<a.length();i++)
			{
				result.add(' ');
			}
			for(int i=0;i<a.length();i++)
			{
				if(a.charAt(i)=='(')
				{
					b.push('(');
					left.add(i);
				}
				if(a.charAt(i)==')')
				{
					if(b.isEmpty())
					{
						right.add(i);
					}
					else if(b.peek()=='(')
					{
						b.pop();
						left.remove(left.get(left.size()-1));
					}
				}
			}
			for(int i=0;i<right.size();i++)
			{
				result.set(right.get(i),'?');
			}
			for(int i=0;i<left.size();i++)
			{
				result.set(left.get(i),'$');
			}
			for(int i=0;i<a.length();i++)
			{
				System.out.print(result.get(i));
			}
			System.out.print('\n');
		}
		sc.close();
	}
}

在提交过程中发现:1、Java不能直接while(true)  2、结束后,输入Scanner需要关闭

另:Java版未想到更精简的代码,希望有dalao教教~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值