C计算器功能实现的问题。很迷惑!!!!!!各位帮帮我吧!!

liangshixue 2010-04-23 08:10:10
这是个简单计算器的的代码 在网上参考下 又自己写的。请大家直接看后面的问题!程序在devc++里通过。供调试使用!


#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAX_SIZE 100

typedef char ElemType;

typedef struct StackList
{
ElemType data[MAX_SIZE];
int top;
}SeqStack;

//³初始化栈
SeqStack * InitStack()
{
SeqStack *p;
if((p = (SeqStack*)malloc(sizeof(SeqStack)))==NULL)
{
printf("³õʼ»¯Õ»Ê§°Ü£¬Ã»ÓÐ×ã¹»¿Õ¼ä\n");
return NULL;
}

p->top=-1;
return p;
};


//判空
int IsEmptyStack(SeqStack *s)
{
return s->top == -1 ? 1 :0;
} ;

//入栈
SeqStack* Push(SeqStack* s,ElemType data)
{
if(s->top==MAX_SIZE-1)
{
printf("Õ»Âú£¡\n");
}
else
{
s->top++;
s->data[s->top]=data;
return s;
}
}

//出战
ElemType Pop(SeqStack* s)
{
if(IsEmptyStack(s))
{
printf("Õ»¿Õ\n");
exit(0);
}
else
{
ElemType temp = s->data[s->top];
s->top--;
return temp;
}
}

//获取栈顶数据
ElemType GetTop(SeqStack *s)
{
if(IsEmptyStack(s))
{
printf("Õ»¿Õ\n");
exit(0);
}
else
{
return s->data[s->top];
}
}

/************************************************************/
//是否是数字
int IsValue(char ch)
{
return ch>='0' && ch<='9' ? 1 :0;
};


//是否是操作符
int isOperate(char ch)
{
return ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')' ? 1 :0;
};

//是否是合法字符
int isAvail(char ch)
{
return IsValue(ch)||isOperate(ch) ? 1 : 0;
};


//获取矩阵坐标
int getNum(char ch)
{
int i=0;
char oper[7]={'+','-','*','/','(',')'};
for(i=0;i<7;i++)
{
if(ch==oper[i])
{
return i;
}
}
}

//判断操作符优先级operF为栈顶,operL为当前操作符
char GetOper(char operF,char operL)
{
//+ - * / ( );
char Priority[6][6]={
{'<','<','<','<','>','>'},
{'<','<','<','<','>','>'},
{'>','>','<','<','>','>'},
{'>','>','<','<','>','>'},
{'>','>','>','>','>','='},
{'<','<','<','<','=','0'}
};

char row = getNum(operF);
char col = getNum(operL);
return Priority[row][col];
};


//如果输入的数字是2位树以上返回该数字的字符串
char* ConvertToNum(char**cElement)
{
char *first ,*temp ;
first=temp = (char*)malloc(sizeof(char)*10);
while(isAvail(**cElement)&&(!isOperate(**cElement))&&**cElement!='\0')//Èç¹ûÊÇÓÐЧ×Ö·û
{
*temp++=*(*cElement)++;
}
*temp ='\0';
// printf("ŶӴ%s",first);
return first;
// return atol(temp);
}

//逆波兰是转换
char * PutsNBL(char* element)
{
char *numStr[100],*ch;
int i=0;
SeqStack *stack =InitStack();

while(*element!='\0')
{
if(IsValue(*element))
{
ch= ConvertToNum(&element);
numStr[i++]=ch;

// printf("Êî´ÙÊÇ£º%s---£º",numStr[i-1]);
}
else
{
if(IsEmptyStack(stack))
{
Push(stack,*element++);

}
else
{
char op = GetOper(*element,GetTop(stack));
switch(op)
{
case '>':
Push(stack,*element);
element++;
break;
case '<':
if(!IsEmptyStack(stack))
{
char *tems = (char*)malloc(sizeof(char)*2);
*tems= Pop(stack);
*(tems+1)='\0';
numStr[i++]=tems;
}
break;
case '=':
Pop(stack);
element++;
break;
}
}
}
}


while(!IsEmptyStack(stack))
{
char *tem = (char*)malloc(sizeof(char)*2);
*tem= Pop(stack);
*(tem+1)='\0';
numStr[i++]=tem;
}



//输出逆波兰式
int k=0;
while(numStr[k])
{
printf("Ä沨À¼£º%s\n",numStr[k++]);
};

return NULL;
}


/**********************************************/

int main(int argc, char *argv[])
{
/*char ch;
SeqStack *s =InitStack();
while((ch=getchar())!='\n')
{
Push(s,ch);
}
Push(s,'#fdfds#');
while(!IsEmptyStack(s))
{
char c = Pop(s);
printf("%c",c);
}
*/

char mathStr[100];
gets(mathStr);
PutsNBL(mathStr);

system("PAUSE");
return 0;
}




在网上看了下计算器的程序,又自己动手写。但是有几个问题不明白!

1. //输出逆波兰式
int k=0;
while(numStr[k])
{
printf("Ä沨À¼£º%s\n",numStr[k++]);
};
这里总会有错误要退出,无论我怎么判断while(numStr[k])这里总是不能正确的结束循环,


2.在函数 char * PutsNBL(char* element) 这里我主要是想把生成的逆波兰式子存放到
char *numStr[100]指针数组里!
然后在别的函数里处理进行运算,问题在
case '<':
if(!IsEmptyStack(stack))
{
char *tems = (char*)malloc(sizeof(char)*2);
*tems= Pop(stack);
*(tems+1)='\0';
numStr[i++]=tems;
}
break;
出栈的是个字符‘+’‘-’....要存到 char *numStr[100]里就必须给个指针。我想来想去么也就想出这么个办法。malloc个地址。但是有malloc就得有free。如果在这个函数结尾free那函数要返回指针数组就没数据啦。。

再就是char *tems = (char*)malloc(sizeof(char)*2);

在这个case中可能会出现好多个上面的语句,要是在函数结尾释放,那我要在哪里释放呢。怎么释放啊?,好几个char *tems 那我free(tems);到底是释放了哪个呢?

本来还以为看懂指针了呢 结果越写越糊涂。我总觉得我写的那段咋看都不对劲呢!!

还有如果各位能看懂的话 能不能给个更好的办法解决这个问题!!

希望各位不吝赐教 ,小弟这里就谢谢各位啦
...全文
87 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2010-04-24
  • 打赏
  • 举报
回复
帮顶。
skyworth98 2010-04-23
  • 打赏
  • 举报
回复
并不是说有malloc就一定有free
而是说,你应该在你不用的时候free

[Quote=引用楼主 liangshixue 的回复:]
这是个简单计算器的的代码 在网上参考下 又自己写的。请大家直接看后面的问题!程序在devc++里通过。供调试使用!


C/C++ code

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAX_SIZE 100

typedef char ElemType;

typedef str……
[/Quote]
shashenyidaoOCEAN 2010-04-23
  • 打赏
  • 举报
回复
我只有崇拜你的份了

69,373

社区成员

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

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