Coursera 学习记录:复杂一些的符号匹配(栈的后进先出思想)

版权声明:知识内容为原创思考,转载请注明:转自 https://blog.csdn.net/SmartLoveyu/article/details/84589449

描述

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

输入

输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100
注意:cin.getline(str,100)最多只能输入99个字符!

((ABCD(x)
$$
)(rttyy())sss)(
?            ?$

如果不直接使用stack,那么就需要按照入栈和出栈的思考,自己加上是否入栈的flag,然后递归调用函数。

//注意题目的输入要求
#include<iostream>
#include<cstring>// 使用memcpy
using namespace std;
char inchar[101];
char outchar[101];
bool in = false;
// 另一种解决方法
int check(bool in, int s) {
	for (int i = s; i < 100; i++) {
		if (outchar[i] == ')') {
			if (in == false) {
				outchar[i] = '?';
			}
				//说明在此之前没有‘(’
			if (in == true) {
				outchar[i] = ' ';
				outchar[s - 1] = ' ';
				return 0;
			}
		}

		if (outchar[i] == '(') {
			outchar[i] = '$';
			check(true, i + 1);//使用递归
		}

		if (outchar[i] != '(' && outchar[i] != ')' && outchar[i] != '?' && outchar[i] != '$') {
			if (outchar[i] == '\0' || i == 99) 
				return 0;
			else 
				outchar[i] = ' ';
			
		}
	}
	
}

int main() {
	while (cin.getline(inchar, 101)) {
		memcpy(outchar, inchar, sizeof(inchar));
		check(false, 0);
		for (int i = 0; i < 100; i++) {
			if (inchar[i] != '\0') {
				cout << inchar[i];
				if (i == 99) {
					cout << endl;
					break;
				}
			}
			else {
				cout << endl;
				break;
			}
		}

		for (int i = 0; i < 100; i++) {
			if (outchar[i] != '\0') {
				cout << outchar[i];
				if (i == 99) {
					cout << endl;
					break;
				}
			}
			else {
				cout << endl;
				break;
			}

		}
	}
	return 0;
}

 如果使用stack模块,就会很简单(当然,也需要相应的学习)

#include<iostream>
#include<stack>
using namespace std;
stack<int> st;
char inchar[100];
char outchar[100];
// 使用栈的后入先出来执行括号的匹配

int main() {
	while (cin >> inchar) {
		int j;
		for ( j = 0; inchar[j] != 0; j++) {
			//如果是(直接进栈
			if (inchar[j] == '(') {
				st.push(j);// 将j位置的字符压入栈
				outchar[j] = ' ';// 暂时将对应位置的输出改为空格
			}
			else if (inchar[j] == ')') {
				if (st.empty() == false) {
					st.pop();
					outchar[j] = ' ';
				}// 栈顶不为空
				else outchar[j] = '?';
			}
			else outchar[j] = ' ';// 非括号的情况
		}
	// 如果栈顶非空,说明还有多余的左括号
		while (!st.empty()) {
			outchar[st.top()] = '$';//.top()返回的顶层项在数组中的下标
			st.pop();
		}
		//outchar[j] = 0;
		puts(inchar);
		puts(outchar);
	}
	return 0;

}

猜你喜欢

转载自blog.csdn.net/SmartLoveyu/article/details/84589449