| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1938 人关注过本帖
标题:[求助]求用栈求值算术表达式的值源码
只看楼主 加入收藏
柒兲
Rank: 1
等 级:新手上路
威 望:1
帖 子:126
专家分:0
注 册:2007-9-26
收藏
 问题点数:0 回复次数:5 
[求助]求用栈求值算术表达式的值源码
那个师兄`给个C的源码` `能运行的`!谢谢``
搜索更多相关主题的帖子: 算术 求值 源码 表达 
2007-09-26 21:13
duyanchao
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2007-6-12
收藏
得分:0 
我有一个类似计算器的
用堆栈计算的
你需要么?


新手!老纯啦...
2007-10-07 12:36
duyanchao
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2007-6-12
收藏
得分:0 

#include <iostream.h>
#include <cstdio>
#include <stdlib.h>
#include <malloc.h>
#define STATCK_INTI_SIZE 100
#define stackingcreement 10
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int selemtype;
typedef int status;
typedef struct {
selemtype *base;
selemtype *top;
int stacksize;
} sqstack;//定义栈;
typedef struct {
char *base;
char *top;
int stacksize;
} sqstack1;//定义栈;

status initstack(sqstack &s){
//构造一个栈
s.base=(selemtype *)malloc((STATCK_INTI_SIZE)*sizeof(selemtype));
if(!s.base) exit(OVERFLOW);
s.top=s.base;
s.stacksize=STATCK_INTI_SIZE;
return OK;
}
//初始化一个栈

void push(sqstack &s,selemtype e){

if((s.top-s.base)>=s.stacksize){
//栈满追加空间
s.base=(selemtype *)realloc (s.base,(s.stacksize+STATCK_INTI_SIZE)*sizeof(selemtype));
if(!s.base) exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=stackingcreement;
}
*s.top++=e;
}
//出棧

int pop(sqstack &s,selemtype e){
e=*(--(s.top));
return e;
}

//入棧
int gettop(sqstack s){
int e;
e=*(--(s.top));
return e;
}

//以下是用于处理字符的堆栈

status initstack1(sqstack1 &s){
//构造一个栈
s.base=(char *)malloc((STATCK_INTI_SIZE)*sizeof(char));
if(!s.base) exit(OVERFLOW);
s.top=s.base;
s.stacksize=STATCK_INTI_SIZE;
return OK;
}

void push1(sqstack1 &s,char e){

if((s.top-s.base)>=s.stacksize){
//栈满追加空间
s.base=(char *)realloc (s.base,(s.stacksize+STATCK_INTI_SIZE)*sizeof(char));
if(!s.base) exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=stackingcreement;
}
*s.top++=e;
}
//出棧

char pop1(sqstack1 &s,char e){
e=*(--(s.top));
return e;
}

char gettop1(sqstack1 s){
char e;
e=*(--(s.top));
return e;
}


status display(sqstack s)
{
int *p=s.base;
int i=0;
for(i=0;i<(s.top-s.base);i++)
{

printf("%d",*p);
p++;
}
return OK;

}

status display1(sqstack1 s)
{
char *p=s.base;
int i=0;
for(i=0;i<(s.top-s.base);i++)
{

printf("%c",*p);
p++;
}
return OK;

}

//结束

////////以下是关于计算的算法(仅仅能计算一位算数)


status isin(char c)//判断是否是运算符
{
int a;
switch(c)
{
case '+':a=1;break;
case '-':a=1;break;
case '*':a=1;break;
case '/':a=1;break;
case '(':a=1;break;
case ')':a=1;break;
case '#':a=1;break;

default:a=0;break;
}
return a;
}

char precede(char a,char b)//比较运算符的优先级(加法有问题)
{
char c;
switch(a)
{
case '+':
{
switch(b)
{
case '+':c='>';break;
case '-':c='>';break;
case '*':c='<';break;
case '/':c='<';break;
case '(':c='<';break;
case ')':c='>';break;
case '#':c='>';break;
default:printf("输入错误\n");break;
}
}break;
case '-':
{
switch(b)
{
case '+':c='>';break;
case '-':c='>';break;
case '*':c='<';break;
case '/':c='<';break;
case '(':c='<';break;
case ')':c='>';break;
case '#':c='>';break;
default:printf("输入错误\n");break;
}
}break;
case '*':
{
switch(b)
{
case '+':c='>';break;
case '-':c='>';break;
case '*':c='>';break;
case '/':c='>';break;
case '(':c='<';break;
case ')':c='>';break;
case '#':c='>';break;
default:printf("输入错误\n");break;
}
}break;
case '/':
{
switch(b)
{
case '+':c='>';break;
case '-':c='>';break;
case '*':c='>';break;
case '/':c='>';break;
case '(':c='<';break;
case ')':c='>';break;
case '#':c='>';break;
default:printf("输入错误\n");break;
}
}break;
case '(':
{
switch(b)
{ case '+':c='<';break;
case '-':c='<';break;
case '*':c='<';break;
case '/':c='<';break;
case '(':c='<';break;
case ')':c='=';break;
}
}break;
case ')':
{
switch(b)
{ case '+':c='>';break;
case '-':c='>';break;
case '*':c='>';break;
case '/':c='<';break;
case ')':c='>';break;
case '#':c='>';break;
default:printf("输入错误\n");break;
}
}break;
case '#':
{switch(b)
{
case '+':c='<';break;
case '-':c='<';break;
case '*':c='<';break;
case '/':c='<';break;
case '(':c='<';break;
case '#':c='=';break;
default:printf("输入错误\n");break;
}
}break;
default:printf("输入错误\n");break;
}
return c;
}


int operate(int a,char thetc,int b)//数字1对应的ASCLL码是48
{
int result;
switch(thetc)
{
case '+':
result=a+b;
break;
case '-':
result=a-b;
break;
case '*':
result=a*b;
break;
case '/':
{
if(b==0)
printf("除数为零,错误\n");
else
result=a/b;
}
}
return result;
}

int evaluateexpression()//算数运算式的解决方案
{
char c;//接受数字
int a,b,e,f;//负责接受需要运算时的数字
char x;//x是专门用于脱去括号
char theta;//theta专门负责用于运算时接受运算符的
sqstack opnd;
sqstack1 optr;
initstack1(optr);push1(optr,'#');
initstack(opnd);c=getchar();
while(c!='#' || gettop1(optr)!='#')
{
if(!isin(c)){

push(opnd,(c-48));
c=getchar();
}//不是运算符就进站
else
switch(precede(gettop1(optr),c))//有问题
{
case '<':{
push1(optr,c);
c=getchar();
}
break;
case '=':{
pop1(optr,x);
c=getchar();
}
break;
case '>':{
theta=pop1(optr,theta);
e=pop(opnd,a);
f=pop(opnd,b);
push(opnd,operate(f,theta,e));
}//有问题
break;


}//switch
}//while
return gettop(opnd);
}

//////////////////算法结束
void main()
{
int k;
k=evaluateexpression();
printf("%d\n",k);
}




输入方法:1+2×3-2#
注意是以#结束.


新手!老纯啦...
2007-10-07 12:40
shohokuooo
Rank: 1
等 级:新手上路
威 望:1
帖 子:93
专家分:0
注 册:2005-1-29
收藏
得分:0 
我晕,太多了吧
具体算法就是建两个栈:1运算副的栈2数值的栈
然后比较进出栈 就是了

2007-10-11 22:14
duyanchao
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2007-6-12
收藏
得分:0 
回复:(shohokuooo)我晕,太多了吧具体算法就是建两个...

是啊!这两个算法我就写了这么多!代码质量不高!望众高手给予指正了.


新手!老纯啦...
2007-10-13 21:54
柒兲
Rank: 1
等 级:新手上路
威 望:1
帖 子:126
专家分:0
注 册:2007-9-26
收藏
得分:0 

哎`这个不好写哦`
我试了很多次都失败了`

2007-11-08 17:58
快速回复:[求助]求用栈求值算术表达式的值源码
数据加载中...
 
   



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

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