
编程的道路上何其孤独!
程序代码:#include <stdio.h>
#include <stdlib.h>
#include "linkstack.h"
#include "seqstack.h"
/*判断是否是数字*/
int IsNum(char c)
{
if (c>='0'&&c<='9'||c=='.') return 1;
else return 0;
}
/*简单运算函数*/
double cal(double a,double b,char t)
{
switch(t)
{
case '+':return (a+b);
case '-':return (a-b);
case '*':return (a*b);
case '/':return (a/b);
default :printf("error!\n");
return 0;
}
}
/*运算符优先级*/
int priority(char op)
{
switch(op)
{
case'\0':
case'#': return 1;
case')': return 2;
case'+':
case'-': return 3;
case'*':
case'/': return 4;
case'(': return 5;
default: printf("运算符错误\n");
return 0;
}
}
/*数字字符串转换成实数*/
double StringToReal(char *s)
{
double result;
char dummy;
if (s == NULL) printf("NULL string passed to StringToReal");
sscanf(s, " %lg %c", &result, &dummy) ;
return (result);
}
/*计算输入表达式的结果*/
int Calculate(char *s)
{
double a,b,result;
char c,w,t,f,*m;
PSeqStack A; /*实数栈*/
PLinkStack B; /*字符栈*/
A=Ini_SeqStack();
B=Ini_LinkStack();
m=s;
Push_LinkStack(B,'#');
w=*s; /*把第一个字符送给w*/
while(w!='\0'||(GetTop_LinkStack(B,&c),c)!='#')
{
if(IsNum(w))
{
Push_SeqStack(A,StringToReal(s));
while(IsNum(w))
w=*(++s);
} /*如果是实数,进实数栈。*/
else
{
if(!priority(w)) { printf("输入错误\n"); system("pause"); return 0;}
if((GetTop_LinkStack(B,&c),c)=='('&&w==')') /*如果栈顶是'('栈外也是')'则,脱括号*/
{
Pop_LinkStack(B,&f);
w=*(++s);
}
else if((GetTop_LinkStack(B,&c),c)=='('||priority((GetTop_LinkStack(B,&c),c))<priority(w))
{
Push_LinkStack(B,w);
w=*(++s);
} /*如果 栈外运算符级别高,入运算符栈。*/
else
{
Pop_SeqStack(A,&b);
Pop_SeqStack(A,&a);
Pop_LinkStack(B,&t);
Push_SeqStack(A,cal(a,b,t));
} /*如果栈内;运算符级别高,取出两个实数和一个操作符运算。*/
}
}
Pop_SeqStack(A,&result);
Destroy_SeqStack(&A);
Destroy_LinkStack(&B);
printf(">%s=%lf\n",m,result);
return 1;
}
static void Help()
{
printf("计算规则:\n");
printf("输入正常的科学计算表达式。\n");
printf("常用操作命令:\n");
printf("Q——退出程序\n");
printf("H——帮助信息\n");
printf("R——清空屏幕\n");
printf("可以使用的运算符:\n");
printf("‘+’——加 \t‘-’——减\t‘*’——乘\n‘/’——除\t‘()’——小括号\n");
}
void main()
{
char *s,ch;
printf("科学计算器(帮助,按H键)\n");
while(1)
{
printf(">");
scanf("%s",s);
ch=toupper(*s);
switch(ch)
{
case 'Q': exit(0);
case 'H': Help();break;
case 'R': system("CLS"); break;
default :Calculate(s);
}
}
}
一个是顺序栈,用来装实数;另一个是链表栈,用来装运算符。
