编程的道路上何其孤独!
回复 11楼 outsider_scu
那你帮代码发来给我看看呗!先谢谢了
#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); } } }一个是顺序栈,用来装实数;另一个是链表栈,用来装运算符。