| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1198 人关注过本帖
标题:[求助]程序分析,得不到结果,结果为0?(我作了修改)
取消只看楼主 加入收藏
evil_evil
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2006-3-4
收藏
 问题点数:0 回复次数:3 
[求助]程序分析,得不到结果,结果为0?(我作了修改)

/*扫描一个算式如#2+5*(5+3)/2-8/9#后算出结果*/
基本思想是从左至右扫描表达式,并
按如下过程进行处理:
⑴ 置shu和fu为空栈;
⑵ 读入表达式的开始操作符c=‘#’,并进fu栈;
⑶ 读入表达式的下一个符号c;
⑷ c<>‘#’或者fu栈顶操作符也不是‘#’时,进行如下操作:
①若c是操纵数,则c进shu栈;
②若c是操作符,则比较它与fu栈顶操作符x的优先关系:
若x<c,则c进fu栈,并读入表达式的下一个符号c;
若x=c,则fu退栈,并读入表达式的下一个符号c;
若x>c,则从shu栈退出x所要求的操作数,x从fu栈退出,
并完 成x的计算,其结果进shu栈;
③重复⑷直到条件不成立;
⑸ 当c=‘#’,同时ops栈顶元素也是‘#’时,shu栈中仅有一个元素,
此即为表达式的值。


#define maxsize 20
typedef struct /*实数栈初始化*/
{
float fbase[maxsize];
int ftop;
}fstack;

typedef struct /*符号栈初始化*/
{
char cbase[maxsize];
int ctop;
}cstack;

void emptyfstack(fstack c) /*实数栈置空*/
{
c.ftop=-1;
}

int emptyf(fstack c) /*判断实数栈是否为空*/
{
if(c.ftop==-1)
return 1;
else
return 0;
}

void emptycstack(cstack c) /*符号栈置空*/
{
c.ctop=-1;
}

int emptyc(cstack c) /*判断符号栈是否为空*/
{
if(c.ctop==-1)
return 1;
else
return 0;
}

void pushfstack(fstack c,float e) /*数字入栈*/
{
if(c.ftop==maxsize-1)
printf("the stack is overflow\n");
else
c.fbase[++c.ftop]=e;
}

void pushcstack(cstack c,char e) /*符号入栈*/
{
if(c.ctop==maxsize-1)
printf("the stack is overflow\n");
else
c.cbase[++c.ctop]=e;
}

void popfstack(fstack c,float e) /*数字退栈*/
{
if(c.ftop==-1)
printf("the stack is underflow\n");
else
e=c.fbase[c.ftop--];
}

void popcstack(cstack c,char e) /*符号退栈*/
{
if(c.ctop==-1)
printf("the stack is underflow\n");
else
e=c.cbase[c.ctop--];
}

float getfstack(fstack c) /*取数字栈栈顶元素*/
{
float e;
if(emptyf(c))
printf("the stack is empty");
else
{
e=c.fbase[c.ftop];
return e;
}
}

char getcstack(cstack c) /*取符号栈栈顶无素*/
{
char e;
if(emptyc(c))
printf("the stack is empty");
else
{
e=c.cbase[c.ctop];
return e;
}
}

int priority(char c) /*符号优先级*/
{
switch(c)
{
case '#':return -1;
case ')':return 0;
case '+':
case '-':return 1;
case '*':
case '/':return 2;
case '(':return 3;
default:return -1;
}
}

void oper(fstack a,cstack b,char c) /*操作数的操作*/
{
float v,v1,v2;char s;
if(priority(getcstack(b))<priority(c))
pushcstack(b,c);
else if(priority(getcstack(b))>=priority(c))
{
if(getcstack(b)=='+')
{popfstack(a,v1);popfstack(a,v2);v=v1+v2;pushfstack(a,v);}
else if(getcstack(b)=='-')
{popfstack(a,v1);popfstack(a,v2);v=v2-v1;pushfstack(a,v);}
else if(getcstack(b)=='*')
{popfstack(a,v1);popfstack(a,v2);v=v1*v2;pushfstack(a,v);}
else if(getcstack(b)=='/')
{popfstack(a,v1);popfstack(a,v2);v=v2/v1;pushfstack(a,v);}
else if(getcstack(b)=='(')
{
if(c==')')
popcstack(b,s);
else
pushcstack(b,c);
}
}
}

#include<stdio.h>
main()
{
fstack shu;
cstack fu;
char c[maxsize];
int i;
float x;
emptyfstack(shu);
emptycstack(fu);
printf("输入算式,开始结束以#号为标识:");
scanf("%s",c);
for(i=0;c[i]!='\0';i++)
{
if(c[i]>='0'&&c[i]<='9')
{
for(x=0.0;c[i]>='0'&&c[i]<='9';i++)
x=x*10+(c[i]-'0');
pushfstack(shu,x);
}
else if(emptyc(fu))
pushcstack(fu,c[i]);
else
oper(shu,fu,c[i]);
}
printf("%f",getfstack(shu));
getch();
}

[此贴子已经被作者于2006-4-2 12:31:52编辑过]

搜索更多相关主题的帖子: 程序分析 结果 得不到 
2006-03-26 11:16
evil_evil
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2006-3-4
收藏
得分:0 
thank you 我回去慢慢看!但我想知道我的程序哪里错了

[此贴子已经被作者于2006-3-26 12:22:51编辑过]



潜水员!
2006-03-26 11:48
evil_evil
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2006-3-4
收藏
得分:0 

呵呵,对C荒废了半年,惭愧惭愧.....


潜水员!
2006-03-26 17:37
evil_evil
Rank: 1
等 级:新手上路
帖 子:38
专家分:0
注 册:2006-3-4
收藏
得分:0 
我改了改,但结果为0?

潜水员!
2006-04-02 12:04
快速回复:[求助]程序分析,得不到结果,结果为0?(我作了修改)
数据加载中...
 
   



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

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