判断表达式中的括号是否正确配对。求教。

whdugh 2013-01-20 09:14:09
假设表达式中允许包含三种括号:()、[]和{}。编写一个算法判断表达式中的括号是否正确配对。
思路:设置一个括号栈,扫描表达式,遇到左括号时进栈,遇到右括号,若是相匹配的左括号,则出栈,否则返回0。若表达式扫描结束后,栈为空,返回1,表示括号正确匹配,否则返回0。哎!写不出来。有没有完整的代码额。
...全文
6298 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
A1661889804 2014-04-09
  • 打赏
  • 举报
回复
A1661889804 2014-04-09
  • 打赏
  • 举报
回复
whdugh 2013-01-23
  • 打赏
  • 举报
回复
引用 1 楼 mujiok2003 的回复:
参考一下。 C/C++ code ? 123456789101112131415161718192021222324252627282930 #include <stdio.h> #include <string.h> int main() { char* input = "{a+[b+(c+d)]}"; char* sep = "{}()……
有点看不明白
whdugh 2013-01-23
  • 打赏
  • 举报
回复
自己写了段 求大神们指点
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
    ElemType data[MAXSIZE];
    int top;  //定义栈指针
} SqStack; /*顺序栈类型定义 */
void correct(char *str[], int n)
{
    SqStack *s;
    char exp[MAXSIZE];
    int top = 1; //栈顶指针 为何设置成1?
    int i = 0;
    int tag = 1;
    while(i < n &&) //栈不为空时执行循环
    {
        if(exp[i] == '(' || exp[i] == '[' || exp[i] == '{')
        {
            top++;
            str[top] = exp[i]; //这里为什么要将 exp[i]赋给数组?
        }
        if(exp[i] = ')')
            if(str[top] == '(')
                top--;  //出栈
            else
                tag = 0;
        if(exp[i] = ']')
            if(str[top] == '[')
                top--;  //出栈
            else
                tag = 0;
        if(exp[i] = '}')
            if(str[top] == '{')
                top--;  //出栈
            else
                tag = 0;

        if(top > -1)
            tag = 0;
        return tag;
    }
}
疯狂的红豆 2013-01-22
  • 打赏
  • 举报
回复
利用栈实现的,仅供参考:

	string str = "{a+[b+(c-d)]}";
	stack<char> sta_ch;
	char chTemp = ' ';
	char topTemp = ' ';
	for(std::size_t idx = 0; idx < str.length(); idx++)
	{
		chTemp = str[idx];
		if((chTemp == '{') || (chTemp == '[') || (chTemp == '('))
		{
			sta_ch.push(chTemp);
		}
		else
		{
			topTemp = sta_ch.top();
		    if(chTemp == '}')
		    {
				sta_ch.pop();
			    if(topTemp != '{')
			    {
				    cout<<"未匹配"<<endl;
				    break;
			    }
		    }
		    else if(chTemp == ']')
		    {
				sta_ch.pop();
				if(topTemp != '[')
				{
					cout<<"未匹配"<<endl;
					break;
				}
		    }
			else if(chTemp == ')')
			{
				sta_ch.pop();
				if(topTemp != '(')
				{
					cout<<"未匹配"<<endl;
					break;
				}
			}
		}
	}

	if(!sta_ch.empty())
	{
		cout<<"不匹配"<<endl;
	}
	else
	{
		cout<<"匹配成功"<<endl;
	}
zhcosin 2013-01-22
  • 打赏
  • 举报
回复
上面第三行写错了,是 return -1;
zhcosin 2013-01-22
  • 打赏
  • 举报
回复
个人意见:不要使用中括号和大括号,建议使用嵌套的小括号,这样可以简化这个工作,下面就是只使用小括号的匹配,很简单的: [code=c/c++] int BracketsIsMatch(const char *str) { if (str == NULL || *str == '\0') return true; int level = 0; for (const char *p = str; *p != '\0'; p++) { if (*p == '(') level++; else if (*p == ')') { if (--level < 0) return -1; } } return (level == 0) ? 0 : -1; } [/code]
wszzfzsc 2013-01-22
  • 打赏
  • 举报
回复
采用栈可以判断
wizard_tiger 2013-01-22
  • 打赏
  • 举报
回复
这个用栈就可以了。
ForestDB 2013-01-22
  • 打赏
  • 举报
回复
赵4老师 2013-01-22
  • 打赏
  • 举报
回复 2
#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);
}
BrightPi 2013-01-21
  • 打赏
  • 举报
回复
这个easy啊,问题是去实现一个栈机制就ok了。
AnYidan 2013-01-21
  • 打赏
  • 举报
回复
google
滴水梵音 2013-01-21
  • 打赏
  • 举报
回复
采用栈数据结构处理符号配对问题,再适合不过了。
mujiok2003 2013-01-20
  • 打赏
  • 举报
回复
参考一下。
#include <stdio.h>
#include <string.h>
 
int main() 
{
    char* input = "{a+[b+(c+d)]}";
    char* sep = "{}()[]";
    char* pos = input;
    char res[16] = {0}, cnt = 0;
    //把出现的括号依次保存到res 
    do {
        pos = strpbrk(pos, sep);        
        if(pos)
        {
         res[cnt++] = *pos;
          ++pos;
        }
    } while (pos != NULL);
    //不匹配
    if(cnt & 1)
    {
      puts("not matched");
    }
    else
    {
      //res如果对称,则匹配, 未完成,请补充
        puts(res);
    }
    return 0;
};

69,322

社区成员

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

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