HZOJ-595:程序调用关系

题目描述

​ 众所周知,计算机程序中通常含有许多的函数调用,而调用关系往往是嵌套的,也就是说被调用的函数可能会调用另一个函数,这导致我们常常在debug的时候遇到困难,并希望能弄清楚其上层的一系列调用关系。

​ 在这道题目中,我们会给定一篇代码,并希望你能找到指定函数第一次被调用时的调用链,将其打印出来;当然,你有可能会发现给定的函数没有在代码中出现,那么你应该打印一行“NOT REFERENCED”并结束你的程序。

​ 为了降低难度,给定的代码是经过极度简化的,它只包括函数调用和返回语句(表示退出这层调用),并且没有任何额外的语法格式。


输入

​ 第一行是一个数字 N�,代表代码共有 N� 行; 

​ 接下来的 N� 行,第 i+1�+1 行是一个字符串 S[i]�[�],代表第 i� 行代码: 

​   1. 这行代码是一个函数调用,那么它的形式类似“fun()”; 

​   2. 这行代码是返回语句,它的内容固定为“return”; 

​ 第 N+2�+2 行是一个字符串,代表欲寻找到的函数。 

​ (0

输出

​ 输出一行:

  1. 如果指定的函数在代码中出现了,那么打印出其调用关系链,用“->”连接;

  2. 否则,打印一行“NOT REFERENCED”。


样例输入
5
fun1()
fun2()
return
fun3()
fun4()
fun4()
样例输出
fun1()->fun3()->fun4()

数据规模与约定

​ 时间限制:1 s

​ 内存限制:256 M

#include 
#include 

int main() {
	int n, flag = 0;
	scanf("%d\n", &n);
	char s[100000][110] = { 0 };
	char q[100000][110] = { 0 };
	for (int i = 0; i < n; i++) gets(s[i]);
	char ans[110];
	gets(ans);
	int k = 0;
	for (int i = 0; i < n; i++) {
		if (strcmp(s[i], ans) == 0) {
			strcpy(q[k], s[i]);
			flag = 1;
			break;
		}
		if (strcmp(s[i], "return") == 0) k--;
		else {
			strcpy(q[k], s[i]);
			k++;
		}
	}
	if (flag == 0) {
		printf("NOT REFERENCED");
		return 0;
	}
	for (int i = 0; i <= k; i++) {
		if (i > 0) printf("->");
		printf("%s", q[i]);
	}
	return 0;
}

你可能感兴趣的:(算法题,算法,数据结构)