`
xitong
  • 浏览: 6188958 次
文章分类
社区版块
存档分类
最新评论

括号匹配检测——栈的应用

 
阅读更多

起因:

周一是我女朋友的生日,无奈公司的接口需要我去调试,心里也确实放不下公司的事情,结果周末两天都在公司调试加班,今天周一我和女友都上班,唉,太感谢我女友了,一个男人的高度很大程度上取决于身边的女人啊,祝我宝贝璐璐生日快乐。

题目要求:

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

输入:

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

输出:

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

样例输入:

)(rttyy())sss)(

样例输出:

)(rttyy())sss)(
?            ?$

算法思想:

括号匹配是典型的栈的应用,因此我采用链栈,思路如下:

(1)第一次遍历输入字符串,
1.是左括号,则入栈,同时标记数组的相应位置置空格
2.是右括号,则检测栈是否为空,不为空,则判断有对应的左括号,同时出栈;为空,则没有对应的左括号,标记数组置‘?’
(2)第二次遍历输入字符串,
1.是右括号,则入栈
2.是左括号,则检测栈是否为空,不为空,则判断有对应的右括号,同时出栈;为空,则没有对应的左括号,标记数组置‘$’

代码实现如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//采用链栈的数据结构
struct stacknode
{
	char bracket;
	struct stacknode *next;
};
typedef struct
{
	struct stacknode *top;
}linkstack;

/**
 * Description:初始化链栈
 */
void initstack(linkstack *s)
{
	s -> top = NULL;
}

/**
 * Description;判断栈是否为空
 */
int stackempty(linkstack *s)
{
	int flag;

	flag = (s -> top == NULL)? 1 : 0;

	return flag;
}

/**
 * Description:入栈操作
 */
void push(linkstack *s, char str)
{
	struct stacknode *p;
	p = malloc(sizeof(struct stacknode));
	p -> bracket = str;
	p -> next = s -> top;
	s -> top = p;
}

/**
 * Description:出栈操作
 */
char pop(linkstack *s)
{
	char str;
	struct stacknode *p = s -> top;
	str = p -> bracket;
	s -> top = p -> next;
	free(p);
	return str;
}

int main()
{
	char input[101];
	char flag[101];
	char ch;
	int i, len, j, k;
	linkstack *s;
	s = malloc(sizeof(linkstack));

	while(scanf("%s",input) != EOF)
	{
		len = strlen(input);
		initstack(s);
		for(i = 0; i < len; i ++)
		{
			switch(input[i])
			{
				case '(':
					//左括号入栈
					push(s,input[i]);
					flag[i] = ' ';
					break;
				case ')':
					//判断栈空
					if(stackempty(s))
					{
						flag[i] = '?';
					}else
					{
						flag[i] = ' ';
						ch = pop(s);
					}
					break;
				default:
					flag[i] = ' ';
					break;
			}
		}
		initstack(s);
		for(i = len - 1; i >= 0; i --)
		{
			switch(input[i])
			{
				case ')':
					//右括号入栈
					push(s,input[i]);
					break;
				case '(':
					//判断栈空
					if(stackempty(s))
					{
						flag[i] = '$';
					}else
					{
						flag[i] = ' ';
						ch = pop(s);
					}
					break;
				default:
					break;
			}
		}

		//打印输出
		printf("%s\n%s\n",input,flag);
		memset(input,'\0',sizeof(input));
		memset(flag,'\0',sizeof(flag));
	}

	return 0;
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics