| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1483 人关注过本帖
标题:[求助]求匹配
只看楼主 加入收藏
coolg
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2006-5-21
收藏
 问题点数:0 回复次数:21 
[求助]求匹配
谁可以帮我:
编程序:已知一个长的表达式(如 “(3+(2-3)*3)-5/(3-2)”编写一个算法,判断此
表达式中的括号是否符合数学意义上的配对.
搜索更多相关主题的帖子: 数学 括号 算法 表达 
2006-05-23 13:38
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 

这个问题很基础啊, 稍微动下脑筋就应该做的出来啊
每个( 都有一个 )相对应, 所以( )的数量应该是相等的,还有,从左往右, ( 的数量总是大于等于 )的.
#include<stdio.h>
void main()
{
int i=0;
int j=0;
char c[20];
gets(c);
while(c[j]!='\0')
{
if(c[j]=='(')i++;
if(c[j]==')')i--;
if(i<0){printf("wrong\n");break;}
j++;
}
if (i==0)printf("right\n");
}
这里只考虑了括号是否匹配,没有考虑表达式的正确性,即5+()+((0)(1))这样的也算正确

我的征途是星辰大海
2006-05-23 15:54
冰凰紫
Rank: 1
等 级:新手上路
帖 子:78
专家分:0
注 册:2005-12-3
收藏
得分:0 
有道理哈~~!!!楼上的厉害!!

多看帖多回帖,这是态度问题,还是成长的过程~~~!能发帖就是一种进步~~~!
2006-05-23 21:41
coolg
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2006-5-21
收藏
得分:0 

楼上是算法好简单哦!
我们要求的是用栈来做就难了哈!
麻烦换种方法做的啊!!


2006-05-23 21:59
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 

也不是很难啊

/* 本程序只适用于一位操作符的运算
字符型的函数和结构体名后面都加1
整型的函数和结构体名后面都加2 */

#include "Stdio.h"
#include "Conio.h"

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

struct Stack1
{ /*字符类结构体*/
char *base;
char *top;
int stacksize;
};

struct Stack2
{ /*整形结构体*/
int *base;
int *top;
int stacksize;
};

InitStack1(struct Stack1 *S)
{ /*构造一个空栈*/
S->base=(char *)malloc(STACK_INIT_SIZE * sizeof(char));

if (!S->base) printf("Application is failed!");
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
}

InitStack2(struct Stack2 *S)
{ /*构造一个空栈*/
S->base=(int *)malloc(STACK_INIT_SIZE * sizeof(int));

if (!S->base) printf("Application is failed!");
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
}

char GetTop1(struct Stack1 S)
{ /*若栈不空,则返回栈顶元素*/
if (S.top==S.base) return 0;

return(*(S.top-1));

}

int GetTop2(struct Stack2 S)
{ /*若栈不空,则返回栈顶元素*/
if (S.top==S.base) return 0;

return(*(S.top-1));

}

Push1(struct Stack1 *S,char e)
{ /*插入新的栈顶元素*/
if ( (S->top-S->base)>=(S->stacksize) )
{
S->base=(char *)realloc(S->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(char));
if (!S->base) return 0;
S->top=S->base+S->stacksize;
}

*S->top++=e;
}

Push2(struct Stack2 *S,int e)
{ /*插入新的栈顶元素*/
if ( (S->top-S->base)>=(S->stacksize) )
{
S->base=(int *)realloc(S->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(int));
if (!S->base) return 0;
S->top=S->base+S->stacksize;
}

*S->top++=e;
}

char Pop1(struct Stack1 *S)
{ /*若栈不空,则删除S栈顶元素,并返回其值*/
if (S->top==S->base) return 0;

return (*(--S->top));
}

int Pop2(struct Stack2 *S)
{ /*若栈不空,则删除S栈顶元素,并返回其值*/
if (S->top==S->base) return 0;

return (*(--S->top));
}

int Compare(char e)
{ /*比较字符是运算符还是操作数*/
if (e>='0' && e<='9')
return 0;
return 1;
}

char Precede(char e1,char e2)
{
int i=0,j=0;
char save[]={ '+', '-', '*', '/', '(', ')', '#'};
char index[][7]={
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','$'},
{'>','>','>','>','$','>','>'},
{'<','<','<','<','<','$','='}
};
for (i=0;i<7;i++)
{
if (save[i]==e1)
break;
}
for (j=0;j<7;j++)
{
if (save[j]==e2)
break;
}
return index[i][j];
}
int Operate(int operand2,char operate,int operand1)
{

switch (operate)
{
case '+':
return (operand1+operand2);
case '-':
return (operand1-operand2);
case '*':
return (operand1*operand2);
case '/':
return (operand1/operand2);
}
}

int change(int elem,int j)
{
int i=0,response=1;
for (i=0;i<=j;i++)
{
response*=elem;
}
return response;
}

int EvaluateExpression(char in[])
{ /*算术表达式求值的算符优先比较,OP为运算符集合*/
int i=1,j=1;
char temp,*ch=in;
int temp1,temp2;
struct Stack1 S1;
struct Stack2 S2;
InitStack1(&S1); /*S1存放运算符*/
InitStack2(&S2); /*S2存放一位操作数*/

Push1(&S1,*ch);

while ( *(ch+i)!='\0' && S1.base!=S1.top )
{
if (!Compare(*(ch+i)))
{
Push2(&S2,(*(ch+i)-48));
}
else
{
switch (Precede(GetTop1(S1),*(ch+i)))
{
case '<':
Push1(&S1,*(ch+i));
break;
case '=':
Pop1(&S1);
break;
case '>':
temp=Pop1(&S1);
temp1=Pop2(&S2);
temp2=Pop2(&S2);
Push2(&S2,Operate(temp1,temp,temp2));
i--;

break;
}
}
i++;
}
return GetTop2(S2);
}

int main(void)
{
int i=1;
char ch[]="#2+1-(6/3+1*2)+5*1#";

printf("\nThe expression is: ");
for (i=1;i<sizeof(ch)-2;i++)
printf("%c ",ch[i]);
printf("\n\nThe answer is: ");
printf("%d",EvaluateExpression(ch));

getch();
return 0;
}


2006-05-23 22:40
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 
有必要这么复杂吗?
建立一个空栈,遇到( 就入栈,遇到 )就出栈,其余的不管,如果栈为空时仍要求出栈或表达式全部判断完毕后栈不为空则表达式错误.当然这里也没有考虑表达式的正确性.

我的征途是星辰大海
2006-05-23 23:02
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 
对了.楼上..线索二叉树 是不是没有先序加线索的排法?

[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-05-23 23:06
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 

有啊,一共有3种,先序线索数,中序线索数和后序线索数,只是书上一般拿中序线索数和后序线索数来做例子.


我的征途是星辰大海
2006-05-23 23:23
SunShining
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:31
帖 子:2215
专家分:0
注 册:2006-2-17
收藏
得分:0 
http://www.bc-cn.net/bbs/dispbbs.asp?boardID=5&ID=66606&page=1

那你去看看吧..我弄不太明白了..想不通没有根怎么排序..

别忘了把进展告诉我声..我也再去找找资料

[glow=255,violet,2]闭关修炼ing...[/glow] [FLASH=360,180]http://www./chinaren.swf[/FLASH]
2006-05-23 23:37
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 
以下是引用starrysky在2006-5-23 23:02:00的发言:
有必要这么复杂吗?
建立一个空栈,遇到( 就入栈,遇到 )就出栈,其余的不管,如果栈为空时仍要求出栈或表达式全部判断完毕后栈不为空则表达式错误.当然这里也没有考虑表达式的正确性.

是EvaluateExpression()函数复杂吗?这也不是很复杂啊,只是把运算符压入S1中,操作数压入S2中,这就不必担心表达式出错的问题了。
还是建两个不同类型的栈复杂呢?只要复制下就可以了啊。


2006-05-24 12:28
快速回复:[求助]求匹配
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.046859 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved