| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 820 人关注过本帖
标题:兄弟们看看哪错了,是栈表达式求值(在线等)
只看楼主 加入收藏
brilliant
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2005-4-17
收藏
 问题点数:0 回复次数:4 
兄弟们看看哪错了,是栈表达式求值(在线等)

#include<string.h> #include<stdio.h> #include<malloc.h> #include<conio.h> #define N 100 #define M 10

typedef char SElemType;

typedef struct{ SElemType *base; SElemType *top; int stacksize; }SqStack1; typedef struct{ int *base; int *top; int stacksize; }SqStack2; void InitStack1(SqStack1 *s) { s->base=(SElemType *)malloc(N*sizeof(SElemType)); if(!s->base)exit(1); s->top=s->base; s->stacksize=N; }

void InitStack2(SqStack2 *s) { s->base=(int *)malloc(N*sizeof(int)); if(!s->base)exit(1); s->top=s->base; s->stacksize=N; } void Push1(SqStack1 *s,int e) { if(s->top-s->base>=s->stacksize) { s->base=(SElemType*)realloc(s->base,(s->stacksize+=M)*sizeof(SElemType)); if(!s->base)exit(1); s->top=s->base+s->stacksize; s->stacksize+=M; }

*s->top++=e;

} void Push2(SqStack2 *s,int e) {

if(s->top-s->base>=s->stacksize) { s->base=(int*)realloc(s->base,(s->stacksize+=M)*sizeof(int)); if(!s->base)exit(1); s->top=s->base+s->stacksize; s->stacksize+=M; }

*s->top++=e; }

int GetTop1(SqStack1 *s) {int e; if(s->top==s->base) return 1; e=*(s->top-1); return e; } int GetTop2(SqStack2 *s) {int e; if(s->top==s->base) return 1; e=*(s->top-1); return e; } void Pop1(SqStack1 *s,int e) {

e=*--s->top;

} void Pop2(SqStack2 *s,int e) {

e=*--s->top;

}

char OP[10]={'+','-','*','/','(',')','#'}; int precede[7][7]={ 1,1,2,2,2,1,1, 1,1,2,2,2,1,1, 1,1,1,1,2,1,1, 1,1,1,1,2,1,1, 2,2,2,2,2,3,0, 1,1,1,1,0,1,1, 2,2,2,2,2,0,3};

int In(char c) { int i=0; while(i<7) {if(c==OP[i++]) return 1; return 0;} }

char Precede(char op,char c) { int pos_op; int pos_c; int i; for(i=0;i<7;i++) { if(op==OP[i]) pos_op=i; if(c==OP[i]) pos_c=i; } switch(precede[pos_op][pos_c]) { case 1: return '>'; case 2: return '<'; case 3: return '='; } }

int Operate(int a,char theta,int b) { switch(theta) { case '+':return a+b; case '-':return a-b+'0'; case '*':return (a-'0')*(b-'0')+'0'; case '/':return (a-'0')/(b-'0')+'0'; } }

char EvaluateExpression() { SqStack2 *OPND;SqStack1 *OPTR; char c,x,theta; char a,b; InitStack1(OPTR); Push1(OPTR,'#'); InitStack2(OPND); c=getchar(); while(c!='#'||GetTop1(OPTR)!='#') { if(!In(c)) {Push2(OPND,c);c=getchar();} else switch(Precede(GetTop1(OPTR),c)) { case '<': Push1(OPTR,c); c=getchar(); break; case '=':

Pop1(OPTR,x); c=getchar(); break; case '>': Pop1(OPTR,theta); Pop2(OPND,b); Pop2(OPND,a); Push2(OPND,Operate(a,theta,b)); break; } } c=GetTop2(OPND);

return c; }

main() { char i; printf("\n\n\n\nOnly within 0..9 evaluation,input a expression end with symbol #:\n"); i=EvaluateExpression(); printf("\nThis expression's result is: "); printf("%d\n\n\n\n",i); getch(); } 

搜索更多相关主题的帖子: 求值 兄弟 表达 在线 
2005-04-18 21:41
形影随从
Rank: 1
等 级:新手上路
威 望:1
帖 子:188
专家分:0
注 册:2005-3-15
收藏
得分:0 
这么长。看得头晕。等后面的大虾来吧!!不好意思!!

2005-04-18 22:54
brilliant
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2005-4-17
收藏
得分:0 
难道没人救命吗???先谢一下楼上的兄弟
2005-04-19 10:06
luckbird
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2005-3-21
收藏
得分:0 
s-&gt;top-s-&gt;base&gt;=s-&gt;stacksize
先把这里的=改成==再说

2005-04-19 18:22
佳佳
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2005-4-12
收藏
得分:0 
级别太低,看了头晕.帮不了你,非常抱歉.

2005-04-19 18:25
快速回复:兄弟们看看哪错了,是栈表达式求值(在线等)
数据加载中...
 
   



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

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