某司面试题 关于括号匹配问题,求指导

syscofield 2013-08-31 03:28:30
输入一个字符串,判断这个字符串中的括号是否匹配(只针对小括号和中括号),没有
括号就认为是匹配的。若匹配则输出0,否则输出1.括号必须成对出现,([)]的情况认为是
不匹配的。
输入:his name is Jack(a well known person in [Pirates of the Caribbean])
输出:0


关键是([)]的情况怎么考虑?
...全文
586 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
狂风暴雨 2013-10-04
  • 打赏
  • 举报
回复
引用 3 楼 qq120848369 的回复:
那你继续恐惧吧。
syscofield 2013-10-04
  • 打赏
  • 举报
回复 1
#include<stdio.h>
#include<string.h>
int main()
{
	char str[100];
	gets(str);
	int n=(int)strlen(str);
	int i,k=0,flag=0;
	char a[100];
	for(i=0;i<n&&(flag==0);i++)
	{
		
		switch(str[i])
		{
		case '(':
		case '[':a[k++]=str[i];break;
		case ')':
			if(a[k-1]=='('){a[k-1]='\0';k--;}
			else flag=1;
			break;
		case ']':
			if(a[k-1]=='['){a[k-1]='\0';k--;}
			else flag=1;
			break;
		}
	}
	printf("%d\n",flag);
	return 0;
}
赵4老师 2013-09-02
  • 打赏
  • 举报
回复
仅供参考
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define STACK_INIT_SIZE 10
#define STACK_GROW_SIZE 5
#define ELEMTYPE char
#define OK 1
#define ERROR 0
typedef struct { /*建立一个栈的首结点*/
    ELEMTYPE * base;
    ELEMTYPE * top;
    int stacksize;
} SpStack;
int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/
    s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));
    if (!s->base) return ERROR;
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
    return OK;
}
int StackEmpty(SpStack *s) { /*判断栈是否为空*/
    if (s->top==s->base) return OK;
    else                 return ERROR;
}
int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/
    if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/
        s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE)));
        if (!s->base) return ERROR;
        s->stacksize+=STACK_GROW_SIZE;
        s->top=s->base+s->stacksize;
    }
    *s->top++=e;
    return OK;
}
int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/
    if (StackEmpty(s)) return ERROR;
    *e=*(--s->top);
    return OK;
}
int Comp(ELEMTYPE a,ELEMTYPE b) {
    if ((a=='('&&b!=')')
      ||(a=='['&&b!=']')
      ||(a=='{'&&b!='}')) {
        return ERROR;
    } else return OK;
}
int Count(SpStack *s) {
    ELEMTYPE e[STACK_INIT_SIZE*2];
    ELEMTYPE e1;
    int i;

    InitStack(s);
    fgets(e,STACK_INIT_SIZE*2,stdin);
    if ('\n'==e[strlen(e)-1]) e[strlen(e)-1]=0;
    printf("%s\n",e);
    for (i=0;e[i]!='\0';i++) {
        switch (e[i]) {
        case '(':
        case '[':
        case '{':
            Push(s,e[i]);
            break;
        case ')':
        case ']':
        case '}':
            if (StackEmpty(s)) {
                printf("%*s↖右括号多余\n",i+1,"");
                return(ERROR);
            } else Pop(s,&e1);
            if (!Comp(e1,e[i])) {
                printf("%*s↖左右匹配出错\n",i+1,"");
                return(ERROR);
            }
        }
    }
    if (!StackEmpty(s)) {
        printf("%*s↖左括号多余\n",i,"");
        return(ERROR);
    } else {
        printf("匹配正确\n");
        return(OK);
    }
}
void main() {
    SpStack s;
    Count(&s);
    free(s.base);
}
Qyee16 2013-09-02
  • 打赏
  • 举报
回复
有飞机不坐,我就坐火车。。。。。。。。。。。。嘎嘎。。。
红色贝鱼 2013-09-02
  • 打赏
  • 举报
回复
引用 楼主 zhouchichi203 的回复:
输入一个字符串,判断这个字符串中的括号是否匹配(只针对小括号和中括号),没有 括号就认为是匹配的。若匹配则输出0,否则输出1.括号必须成对出现,([)]的情况认为是 不匹配的。 输入:his name is Jack(a well known person in [Pirates of the Caribbean]) 输出:0 关键是([)]的情况怎么考虑?
栈就是先进后出,你可以找最近的匹配,如 ( 和) 匹配相互消去, 【和 】相互消去,比如 】入栈,然后)入栈,然后遇到【,和)这个最近的不能匹配消去,然后(入栈,和最近的【不能匹配消去,结果最终栈不空,括号不匹配,匹配的话,最终栈会清空的。
龍之印 2013-09-02
  • 打赏
  • 举报
回复
引用 14 楼 nickwu1220 的回复:
我用的是STL的栈

int CheakMatch(char *str)
{
	stack<char> staCheak;

	while(*str != '\0')
	{
		switch(*str)
		{
		case '(':
		case '[':
			{
				staCheak.push(*str++);
				break;
			}
		case ')':
		case ']':
			{
				if(!staCheak.empty())
				{
					char top;
					top = staCheak.top();
					staCheak.pop();

					if((*str == ')' && top != '(') || (*str == ']' && top != '['))
						return 1;//不匹配,返回1
					else
					{
						str++;
						break;
					}
				}
				else//没有左括号,不匹配
					return 1;
			}
		default:
			{
				str++;
				break;
			}
		}
	}

	if(staCheak.empty())//栈空,匹配
		return 0;
	else
		return 1;
}
我的思路基本和你一致,可惜今天才看到这个帖子,大致方法就是使用栈,循环遍历整个字符串,如果是正括号就压栈,如果是反括号就从栈中弹出第一个作比较,成对的话继续继续做比较后面的字符,不成对直接返回不匹配。
lin5161678 2013-09-02
  • 打赏
  • 举报
回复
int isLegalStr(char* str)
{
	char stack[100];
	int top;
	for(top=0; *str; ++str)
		switch(*str)
		{
			case '(':
				stack[top++] = ')';		//入栈 
				break;
			case '[':
				stack[top++] = ']';		//入栈 
				break;
			case ']':
			case ')':
				top -= stack[top-1]==*str;	//匹配出栈 不匹配不出栈		
		}

	return !!top;	
}
nickwu1220 2013-09-01
  • 打赏
  • 举报
回复
就是那个党伟 2013-09-01
  • 打赏
  • 举报
回复
引用 3 楼 qq120848369 的回复:
那你继续恐惧吧。
实在
ice50303 2013-09-01
  • 打赏
  • 举报
回复
//这是一份非栈式的解决方案,但是我没写完整;所以应该不是很好阅读,各位小伙伴们慎看哈~~~ int fun (char** srcString ) { //Emp: srcString = "his name is Jack(a well known person in [Pirates of the Caribbean]) " int length = strlen(srcString); char* pVecNaxc = new char[length]; memset(pVecNaxc, 0, length); pVecNaxc[0] = checkType(srcString[0]); //这个函数自己猜去吧,哈哈哈~~~ for (int i = 1; i < length; i++) { int val = checkType(srcString[i]); pVecNaxc[i] = srcString[i-1] + val; if (val < 0) { if (pVecNaxc[i] != pVecNaxc[i-2]) //此处写的不严谨,但是若你看懂了这个解决方案,相信你就能完善了 return 1; } } if ((pVecNaxc[length-1] != 0){ return 1; } return 0; }
艾薇儿More 2013-09-01
  • 打赏
  • 举报
回复
([)]这个原则不就是你的首先匹配']'之后再看),栈不就是现成的嘛 ,请问只有这两种符号吗?递归貌似也可以
xiaogui340 2013-09-01
  • 打赏
  • 举报
回复
既然只针对中小括号,那么找出括号所在字符串中的index,然后对比下index,可否?
willway_c 2013-09-01
  • 打赏
  • 举报
回复
遇到第一个反括号向回找,如果有配套继续向下,如果没有或者配套错误,这不匹配
gongheguoyingpai11 2013-09-01
  • 打赏
  • 举报
回复
最好是用栈吧 不用栈的话可能很难解决
#include <stdio.h>
#include <stdlib.h>

#define  MAX_LEN   256

int  main(void)
{
    char*  str = (char*)malloc(MAX_LEN);
	char*  brackets = (char*)malloc(MAX_LEN);
	
	printf("input a string: ");
	
	fgets(str, MAX_LEN, stdin);
	
	str[strlen(str) - 1] = '\0';
	
	int i;
	int numbers = 0; 
	char now;
	
	for (i = 0; i < MAX_LEN; ++i)
	{
	    if (str[i] == '(')
		{
		    brackets[numbers++] = '(';
		}
		else if (str[i] == '[')
		{
		    brackets[numbers++] = '[';
		}
		else if (str[i] == ')')
		{
		    if (numbers >= 1 && brackets[numbers - 1] == '(')   /*之所以测试numbers>=1 是防止因为右括号多余左括号而引起越界*/
		    {
				--numbers;
            }
            else
            {
                break;
            }
		}
		else if (str[i] == ']')
		{
		    if (numbers >= 1 && brackets[numbers - 1] == '[')
		    {
				--numbers;
            }
            else
            {
                break;
            }
		}
	}
	
	brackets[numbers] = '\0';
	
	if (i < strlen(str) || strlen(brackets) > 0)
	{
        printf("false\n");
    }
    else
    {
        printf("true\n");
    }
    
    system("pause");
	return 0;
}
我写的一个简单的程序
lm_whales 2013-09-01
  • 打赏
  • 举报
回复
被脑筋急转弯搞怕了吧?
楼主自己举的例子显然也不匹配!
和题目所举相同,自然也是不匹配!
例子只是对,相关内容的补充说明!
nickwu1220 2013-09-01
  • 打赏
  • 举报
回复
我用的是STL的栈

int CheakMatch(char *str)
{
	stack<char> staCheak;

	while(*str != '\0')
	{
		switch(*str)
		{
		case '(':
		case '[':
			{
				staCheak.push(*str++);
				break;
			}
		case ')':
		case ']':
			{
				if(!staCheak.empty())
				{
					char top;
					top = staCheak.top();
					staCheak.pop();

					if((*str == ')' && top != '(') || (*str == ']' && top != '['))
						return 1;//不匹配,返回1
					else
					{
						str++;
						break;
					}
				}
				else//没有左括号,不匹配
					return 1;
			}
		default:
			{
				str++;
				break;
			}
		}
	}

	if(staCheak.empty())//栈空,匹配
		return 0;
	else
		return 1;
}
missheaven2011 2013-08-31
  • 打赏
  • 举报
回复
我觉得用递归可以搞定
scutgj2010 2013-08-31
  • 打赏
  • 举报
回复
的确是考察栈的使用,遇到左括号就压栈,遇到匹配的右括号就出栈,当遇到不匹配的括号或者最后栈内还有没有弹出的左括号那就是返回1吧
lty369963 2013-08-31
  • 打赏
  • 举报
回复
出这题的意图就是考你栈,你却。。。年轻人啊
晴天_ccc 2013-08-31
  • 打赏
  • 举报
回复
如果按5楼的说法,那么([)]的情况也认为是对的。还是用栈吧
加载更多回复(6)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧