数据结构24点游戏源代码
24点游戏代码

int i,j,k;
float sum1,sum2,sum3;
for (i=0;i<4;i++)
for (j=0;j<6;j++)
for (k=0;k<6;k++)
{
if ((!(i==3 && b==0)) && (!(j==3 && c==0)) && (!(k==3 && d==0)))
{
sum1=myF(i,a,b);
//printf ("sum2:myF(%d,%2.0f,%2.0f) sum2=%f\n",j,c,d,sum2);
//printf ("2:myF(%d,myF(%d,%2.0f,%2.0f),myF(%d,%2.0f,%2.0f)) sum3=%f\n\n",k,i,a,b,j,c,d,sum3);
sum2=myF(j,sum1,c);
sum3=myF(k,sum2,d);
if (fabs(sum3-24)<0.1)
{
temp++;
myPrint(1,i,j,k,a,b,c,d);
//printf ("sum1:myF(%d,%2.0f,%2.0f) sum1=%f\n",i,a,b,sum1);
}
}
if (k==2)
{
sum1=myF(i,a,b);
sum2=myF(j,c,d);
sum3=sum1*sum2;
if (fabs(sum3-24)<0.1)
{
temp++;
24点游戏程序

24点程序编译环境:dev c++//24点游戏#include<iostream>#define plus 1#define minus 2#define mul 3#define div 4using namespace std;float num[4];char str[5]={' ','+','-','*','/'};float op(int sym,float a,float b){if(sym==plus) return a+b;if(sym==minus) return a-b;if(sym==mul) return a*b;else return a/b;}void swap(int i,int j){float temp=num[i];num[i]=num[j];num[j]=temp;}bool search_ope(){for(int i=1;i<=4;++i)for(int j=1;j<=4;++j)for(int k=1;k<=4;++k){float sum=op(i,num[0],num[1]);sum=op(j,sum,num[2]);sum=op(k,sum,num[3]);if(sum==24){int bracket1=false;int bracket2=false;if(i<=2&&j>=3) bracket1=true;if(j<=2&&k>=3) bracket2=true;for(int count=0;count<bracket1+bracket2;++count)cout<<"(";cout<<(int)num[0]<<str[i]<<num[1];if(bracket1)cout<<")";cout<<str[j]<<(int)num[2];if(bracket2)cout<<")";cout<<str[k]<<(int)num[3]<<endl;return true;}float temp=op(i,num[0],num[1]);sum=op(k,num[2],num[3]);sum=op(j,temp,sum);if(sum==24){int bracket1=false;int bracket2=false;if(i<=2&&j>=3) bracket1=true;if(k<=2) bracket2=true;if(bracket1)cout<<"(";cout<<(int)num[0]<<str[i]<<(int)num[1];if(bracket1)cout<<")";cout<<str[j];if(bracket2) cout<<"(";cout<<num[2]<<str[k]<<num[3];if(bracket2)cout<<")";cout<<endl;return true;}}return false;}bool search(int n){if(n>3) return false;if(search_ope()) return true;if(search(n+1)) return true;for(int i=n+1;i<4;++i){swap(i,n);if(search_ope()) return true;if(search(n+1)) return true;swap(i,n);}return false;}int main(){char flag='Y';loop:cout<<"请输入四个数(1-13):"<<endl;for(int i=0;i<4;++i){cin>>num[i];if(num[i]<=0||num[i]>13){cout<<"错误输入,";goto loop;}}if(!search(0)) cout<<"不能形成24点"<<endl;cout<<"是否继续(Y/N)"<<endl;cin>>flag;while(flag!='Y'&&flag!='N'){cout<<"错误输入,请重新输入(Y/N):"<<endl;cin>>flag;}if(flag=='Y')goto loop;if(flag=='N') return 0;return 0;}本程序仅仅搜索一种答案,如果要搜索全部答案可通过修改递归函数bool search(int n)中的return即可。
24点游戏C语言代码及报告

24点游戏C语言代码及报告24点游戏一,问题分析二十四点游戏规则:给出4个数字,所给数字均为有理数,用加、减、乘、除(可加括号)把给出的数算成24(每个数必须用一次且只能用一次,先算出结果者获胜。
步骤:比如下面的例子:例:3、8、8、9,答案1:(9—8)×8×3答案2: 3×8 ?(9—8)答案3:(9—8?8)×3利用3×8,24、4×6,24求解我的主要想法是首先穷举的可行性问题。
我把表达式如下分成三类—— 1、无括号的简单表达式。
2、有一个括号的简单表达式。
3、有两个括号的较复4、杂表达式。
穷举的开始我对给出的四个数进行排列,其可能的种数为4*3*2*1=24。
我利用一个嵌套函数实现四个数的排列二,源程序及注释//首先穷举的可行性问题。
我把表达式如下分成三类——//1、无括号的简单表达式。
//2、有一个括号的简单表达式。
//3、有两个括号的较复4、杂表达式。
//穷举的开始我对给出的四个数进行排列,其可能的种数为4*3*2*1=24。
我利用一个嵌套函数实现四个数的排列#include <iostream>#include <string>using namespace std;int number=0;string sss[5000];float cal(float a,float b,int p) {switch(p){case 1:return a+b;case 2:return a-b;case 3:return a*b;case 4:return a/b;case 5:return b-a;case 6:return b/a;}}string link(string a,string b,int p) {string st=a;switch(p){case 1:st+=("+"+b);break;case 2:st+=("-"+b);break;case 3:st+=("*"+b);break;case 4:st+=("/"+b);break;case 5:st=b+"-"+st;break;case 6:st=b+"/"+st;break;}st="("+st+")";return st;}void putout1(string c[],int p[]) { string st;st=link(c[1],c[2],p[1]);st=link(st,c[3],p[2]);st=link(st,c[4],p[3]);st=st.erase(0,1);st=st.erase(st.length()-1,1); number++;sss[number]=st;}void putout2(string c[],int p[]) { string st1,st2,st;st1=link(c[1],c[2],p[1]);st2=link(c[3],c[4],p[3]);st=link(st1,st2,p[2]);st=st.erase(0,1);st=st.erase(st.length()-1,1);number++;sss[number]=st;}void suan(float a[],string c[]) {int p[4];int i;float sum,sum1,sum2;for(p[1]=1;p[1]<=6;p[1]++)for(p[2]=1;p[2]<=6;p[2]++)for(p[3]=1;p[3]<=6;p[3]++){sum=cal(a[1],a[2],p[1]);sum=cal(sum,a[3],p[2]);sum=cal(sum,a[4],p[3]);if((sum-24>=0&&sum-24<1e-5)||(sum-24<=0&&sum-24>-1e-5)) putout1(c,p); sum1=cal(a[1],a[2],p[1]);sum2=cal(a[3],a[4],p[3]);sum=cal(sum1,sum2,p[2]);if((sum-24>=0&&sum-24<1e-5)||(sum-24<=0&&sum-24>-1e-5)) putout2(c,p); }}void disorder(float a[],string c[]){float b[5];string d[5];int i,j,k,l;for(i=1;i<=4;i++)for(j=1;j<=4;j++){if(j==i)continue;for(k=1;k<=4;k++){if(k==i||k==j)continue;for(l=1;l<=4;l++){if(l==i||l==j||l==k)continue;b[1]=a[i];b[2]=a[j];b[3]=a[k];b[4]=a[l]; d[1]=c[i];d[2]=c[j];d[3]=c[k];d[4]=c[l]; suan(b,d);}}}}int main(){cout<<"请输入四个数字";float a[5];int i,j;string c[5];for(i=1;i<=4;i++){cin>>a[i];if(a[i]==10)c[i]="10" ;else c[i]=int(a[i])+'0';}disorder(a,c);int v=1,u=0;for(i=1;i<=number;i++){v=1;for(j=1;j<i;j++)if(sss[i]==sss[j])v=0;if(v==1){cout<<sss[i]<<endl;u=1;}}if(u==0)cout<<"无解"<<endl;system("pause");return 0;}三,运行结果显示四,调试和运行程序过程中产生的问题及采取的措施:。
数据结构24点游戏源代码

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<time.h>#define OPSETSIZE 7#define STACK_INIF_SIZE 50#define STACKINCREMENT 10int number[2][4];enum{eNumber = 0, //操作数eOperator = 1 //算子};int oper[7]={43,45,42,47,40,41,35};char OPSET[OPSETSIZE]={'+' , '-' , '*' , '/' ,'(' , ')' , '#'};typedef struct sqlist{int bol;//bol 是0 时,num-ch是一个数字;bol 是1 时num_ch 运算符int num_ch;struct sqlist *next;}sqlist;//线性表typedef struct sqstack{int *base;int *top;int stacksize;}sqstack;//栈的定义unsigned char Prior[7][7] = {// 课本表3.1 算符间的优先关系'>','>','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>','<','<','<','<','<','=',' ','>','>','>','>',' ','>','>','<','<','<','<','<',' ','='};int init_sq(sqlist *l){//初始化链表l=(sqlist*)malloc(sizeof(sqlist));if(l==NULL){exit(-2);}l->next=NULL;return 1;}int insert_sq(sqlist **p,int e,int bl){//链表插入操作sqlist *q;q=(sqlist*)malloc(sizeof(sqlist));q->num_ch=e;q->bol=bl;q->next=NULL;(*p)->next=q;(*p)=(*p)->next;return 1;}int check(sqlist l)//保证输入的数字是给出的四个数字{int right=1,find=0,i;sqlist *q=&l;q=q->next ;for (;q->next!=NULL;q=q->next){if(q->bol==1){if(q->num_ch <=39||q->num_ch>57||q->num_ch==44||q->num_ch==46){ right=0;printf("%c不是有效的运算符!\n");}}else {find=0;for(i=0;i<4;i++){if(number[1][i]==0&&number[0][i]==q->num_ch ){number[1][i]=1;find=1;break;}}if(find==0){printf("%d 不在给出的四个数字中!\n",q->num_ch );right=0;}}}//end forfor (i=0;i<4;i++){if(number[1][i]==0){printf("%d没有用上!\n",number[0][i]);right=0;}}return right;}int chang(char *s,sqlist *l){//将用户的输入转化为单链表int t=0;unsigned int i=0;int bl,ch;int a1,a2,a;sqlist *p=l;for (;i<strlen(s);i++){if(s[i]>47&&s[i]<58&&t==0){a1=(int)s[i]-48;t++;}else if(s[i]>47&&s[i]<58&&t==1){a2=(int)s[i]-48;a=a1*10+a2;t++;}else if(s[i]<48&&s[i]>39&&s[i]!=44&&s[i]!=46){if(t==1){bl=0;insert_sq(&p,a1,bl);t=0;}else if(t==2){bl=0;insert_sq(&p,a,bl);t=0;}bl=1;ch=(int)s[i];insert_sq(&p,ch,bl);t=0;}else {printf("%c不是有效的运算符!\n",s[i]);}} //end fori=strlen(s)-1;if(s[i]>47&&s[i]<58){if(s[i-1]>47&&s[i-1]<58){bl=0;insert_sq(&p,a,bl);}else {bl=0;insert_sq(&p,a1,bl);}}bl=1;a=35;insert_sq(&p,a,bl);return (check(*l));}int Operate(int a,int theta, int b){//计算switch(theta) {case 43: return a+b;case 45: return a-b;case 42: return a*b;case 47:{if(b==0){return -2000;}if (a%b==0){return a/b;}else {//printf("不能为小数\n");return -10000;}}default : return 0;}}int ReturnOpOrd(char op,char* TestOp)// precede()函数调用求优先级{int i;for(i=0; i< OPSETSIZE; i++){if (op == TestOp[i]) return i;}return 0;}char precede(char Aop, char Bop){return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];}int initstack(sqstack *s){(s)->base = (int*)malloc(STACK_INIF_SIZE*sizeof(int));if((s)->base==NULL) exit(-2);(s)->top=(s)->base;(s)->stacksize = STACK_INIF_SIZE;return 1;}int gettop(sqstack *s){ //取得栈顶元素int e;if(s->top==s->base){printf("栈空,无法取得栈顶元素!\n");return 0;}e=*(s->top-1);return e;}int push(sqstack *s,int e){ //压栈if(s->top-s->base>=s->stacksize){s->base=(int*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int));if(!s->base) exit(-2);s->stacksize+= STACKINCREMENT;}*(s->top++)=e;return 1;}int pop(sqstack *s,int *e){ //出栈if(s->top==s->base){printf("栈空,出栈错误!\n");return 0;}*e=*(--s->top);return 1;}int EvaluateExpression(char* MyExpression) { // 算法3.4----计算表达式的值// 算术表达式求值的算符优先算法。
c++24点游戏

c++24点游戏正文第一篇:c++24点游戏 c++24点游戏 #include iostream#include stringusing namespace std; //定义Stack类const maxsize=2022 enum Error_code { success, overflow, underflow };templateclass Stack {public:Stack();bool empty() const;bool full() const;int size() const;void clear();Error_code top(T &item) const;Error_code pop();Error_code push(const T &item);private:int count;T entry[maxsize];};templateStack::Stack() {count=0;}templatebool Stack::empty () const { return count==0;}templatebool Stack::full () const { return count==maxsize;}templateint Stack::size() const {return count;}templatevoid Stack::clear() {count=0;}templateError_code Stack::top (T &item) const { if (empty()) return underflow;item= entry[count-1];return success;}templateError_code Stack::pop () {if (empty()) return underflow;count--;return success;}templateError_code Stack::push (const T &item) {if (full()) return overflow;entry[count++]=item;return success;} Stack sign;Stack num;int set; // 判断程序中的异常,以便适时退出?//void process(char c) //计算两个数的 + - * / 运算// { int k=0;double a,b;sign.pop();if (num.top(b)==success) {num.pop();if (num.top(a)==success) {num.pop();k=1;}}if (k) {switch (c) {case '+': num.push(a+b); break; case '-': num.push(a-b); break; case '*': num.push(a*b); break; case '/':if (b==0) { set=4;num.push(-1);}elsenum.push(a/b);break;}}else {set=1;num.push(-1);}}void get_command(string &str) {coutstr;}double do_command(const string &str) {string s=;double outcome=-1;char c;for (int i=0;str[i]!='\0';i++){if (set!=0) break; //例外则停止运行while (1) { //分离数据与运算符if (str[i]='0' || str[i]=='.') {s+=str[i];i++;}else {if(s!=) {if (num.push(atof(s.c_str ()))==overflow)set=3;s=;break;}}char ch= str[i];switch (ch) { //处理运算的优先级,并注意例外抛出case '*':case '/':if (sign.top(c)==success)if(c=='*'||c=='/') process(c);if (sign.push(ch)==overflow)set=3;break;case '+':case '-':while (sign.top(c)==success) {if (c!='(') process(c);else break;if (sign.push(ch)==overflow) set=3;break;case '(':if (sign.push(ch)==overflow) set=3;break;case ')':while (sign.top(c)==success) { if (c!='(') process(c);else break;}sign.pop();break;case '=':while (sign.top(c)==success) { if (c!='(') process(c);else break;}break;default: set=2;break;}}if (num.size()==1 && sign.size()==0)num.top(outcome);else set=1;if (set==0) coutout; cout>jj;cout13 || a[i]!=int(a[i])) 在输出方面,运算结果等于 24就输出,利用调用的参数判断输出形式,有5种:(a+b)*(c+d),a*(b*(c+d)) ,(a*(b+c))*d ,a*((b+c)*d) ,((a+b)*c)*d。
24点游戏

//初始化数字组合和符号组合 初始化数字组合和符号组合 Cal24(String inputnum) { //生成所输入 生成所输入abcd四个数字的全排列(不可重复使用,如aaaa), 四个数字的全排列( 生成所输入 四个数字的全排列 不可重复使用, ), 去掉重复的, 去掉重复的,保存在 num 字符串集合 for (int i=0;i<4;i++) { for (int j=0;j<4;j++) { for (int k=0;k<4;k++) { if (i==j || i==k || k==j) //去掉重复使用同一数字的情况 去掉重复使用同一数字的情况 continue; int z=6-i-j-k; //计算出剩下的第四个数。 i+j+k+z=6 计算出剩下的第四个数。 计算出剩下的第四个数 num.add(new String(inputnum.substring(i,i+1)+inputnum.substring(j,j+1) +inputnum.substring(k,k+1)+inputnum.substring(z,z+1)向对象基础实例
游戏描述
每次给您4张牌,您用这4张牌的点数和加、 每次给您4张牌,您用这4张牌的点数和加、减、 除符号,还有括号构成一个算术式子, 乘、除符号,还有括号构成一个算术式子,使 式子计算结果为24. 式子计算结果为24.
代码: 代码:
import java.util.*; public class Cal24 { String[] op; Set num = new HashSet(); public static void main(String[] args) { Cal24 cal24; if (args.length<1) { System.out.println("Usage Cal24 abcd"); return; } cal24 = new Cal24(args[0]); cal24.pEx(); }
C++实现简单24点游戏

C++实现简单24点游戏本⽂实例为⼤家分享了C++实现简单24点游戏的具体代码,供⼤家参考,具体内容如下随机⽣成4个代表扑克牌牌⾯的数字字母,程序⾃动列出所有可能算出24的表达式,⽤擅长的语⾔(C/C++/Java或其他均可)实现程序解决问题。
程序风格良好(使⽤⾃定义注释模板)列出表达式⽆重复。
以下为源代码#include<iostream>#include<string>#include <stdlib.h>#include<time.h>using namespace std;char card[] = { 'A','2','3','4','5','6','7','8','9','10','J','Q','K' };char buf[4];double nums[4];char ope[4] = { '+','-','*','/' };void cre()//⽣成{int i = 0;int j;cout << "⽣成的四张牌⾯为:";srand((unsigned)time(0));for (i = 0; i<4; i++){j =rand() % 13;buf[i] = card[j];}cout << buf[0] << ";" << buf[1] << ";" << buf[2] << ";" << buf[3] << "。
c语言计算得到2424点游戏

#include<stdio.h>char mark[4]={'+','-','*','/'};float cal(float x,float y,int mark){switch(mark){case 0:return x+y;case 1:return x-y;case 2:return x*y;case 3:return x/y;}}float calculate_A(float a,float b,float c,float d,int mark1,int mark2,int mark3) {float r1,r2,r3;r1=cal(a,b,mark1);r2=cal(r1,c,mark2);r3=cal(r2,d,mark3);return r3;}float calculate_B(float a,float b,float c,float d,int mark1,int mark2,int mark3) {float r1,r2,r3;r1=cal(b,c,mark2);r2=cal(a,r1,mark1);r3=cal(r2,d,mark3);return r3;}float calculate_C(float a,float b,float c,float d,int mark1,int mark2,int mark3) {float r1,r2,r3;r1=cal(c,d,mark3);r2=cal(b,r1,mark2);r3=cal(a,r2,mark1);return r3;}float calculate_D(float a,float b,float c,float d,int mark1,int mark2,int mark3) {float r1,r2,r3;r1=cal(b,c,mark2);r2=cal(r1,d,mark3);r3=cal(a,r2,mark1);return r3;}float calculate_E(float a,float b,float c,float d,int mark1,int mark2,int mark3){float r1,r2,r3;r1=cal(a,b,mark1);r2=cal(c,d,mark3);r3=cal(r1,r2,mark2);return r3;}float get(int a,int b,int c,int d){int mark1,mark2,mark3;float flag=0;for(mark1=0;mark1<4;mark1++){for(mark2=0;mark2<4;mark2++){for(mark3=0;mark3<4;mark3++){if(calculate_A(a,b,c,d,mark1,mark2,mark3)==24){printf("((%d%c%d)%c%d)%c%d=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d);flag=1;}if(calculate_B(a,b,c,d,mark1,mark2,mark3)==24){printf("(%d%c(%d%c%d))%c%d=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d);flag=1;}if(calculate_C(a,b,c,d,mark1,mark2,mark3)==24){printf("%d%c(%d%c(%d%c%d))=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d);flag=1;}if(calculate_D(a,b,c,d,mark1,mark2,mark3)==24){printf("%d%c((%d%c%d)%c%d)=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d);flag=1;}if(calculate_E(a,b,c,d,mark1,mark2,mark3)==24){printf("(%d%c%d)%c(%d%c%d)=24\n",a,mark[mark1],b,mark[mark2],c,mark[mark3],d);flag=1;}}}}return flag;}main(){int a,b,c,d;loop: printf("Please input 4 numbers(1~10):\n");scanf("%d%d%d%d",&a,&b,&c,&d);if((a>=1&&a<=10)&&(b>=1&&b<=10)&&(c>=1&&c<=10)&&(d>=1&&d<=10)){if(0!=get(a,b,c,d));elseprintf("Sorry!can not find!\n");goto loop;}else{printf("Input illegal(违法),please input again(1~10)\n");goto loop;}system("pause");}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<time.h>#define OPSETSIZE 7#define STACK_INIF_SIZE 50#define STACKINCREMENT 10int number[2][4];enum{eNumber = 0, //操作数eOperator = 1 //算子};int oper[7]={43,45,42,47,40,41,35};char OPSET[OPSETSIZE]={'+' , '-' , '*' , '/' ,'(' , ')' , '#'};typedef struct sqlist{int bol;//bol 是0 时,num-ch是一个数字;bol 是1 时num_ch 运算符int num_ch;struct sqlist *next;}sqlist;//线性表typedef struct sqstack{int *base;int *top;int stacksize;}sqstack;//栈的定义unsigned char Prior[7][7] = {// 课本表3.1 算符间的优先关系'>','>','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>','<','<','<','<','<','=',' ','>','>','>','>',' ','>','>','<','<','<','<','<',' ','='};int init_sq(sqlist *l){//初始化链表l=(sqlist*)malloc(sizeof(sqlist));if(l==NULL){exit(-2);}l->next=NULL;return 1;}int insert_sq(sqlist **p,int e,int bl){//链表插入操作sqlist *q;q=(sqlist*)malloc(sizeof(sqlist));q->num_ch=e;q->bol=bl;q->next=NULL;(*p)->next=q;(*p)=(*p)->next;return 1;}int check(sqlist l)//保证输入的数字是给出的四个数字{int right=1,find=0,i;sqlist *q=&l;q=q->next ;for (;q->next!=NULL;q=q->next){if(q->bol==1){if(q->num_ch <=39||q->num_ch>57||q->num_ch==44||q->num_ch==46){ right=0;printf("%c不是有效的运算符!\n");}}else {find=0;for(i=0;i<4;i++){if(number[1][i]==0&&number[0][i]==q->num_ch ){number[1][i]=1;find=1;break;}}if(find==0){printf("%d 不在给出的四个数字中!\n",q->num_ch );right=0;}}}//end forfor (i=0;i<4;i++){if(number[1][i]==0){printf("%d没有用上!\n",number[0][i]);right=0;}}return right;}int chang(char *s,sqlist *l){//将用户的输入转化为单链表int t=0;unsigned int i=0;int bl,ch;int a1,a2,a;sqlist *p=l;for (;i<strlen(s);i++){if(s[i]>47&&s[i]<58&&t==0){a1=(int)s[i]-48;t++;}else if(s[i]>47&&s[i]<58&&t==1){a2=(int)s[i]-48;a=a1*10+a2;t++;}else if(s[i]<48&&s[i]>39&&s[i]!=44&&s[i]!=46){ if(t==1){bl=0;insert_sq(&p,a1,bl);t=0;}else if(t==2){bl=0;insert_sq(&p,a,bl);t=0;}bl=1;ch=(int)s[i];insert_sq(&p,ch,bl);t=0;}else {printf("%c不是有效的运算符!\n",s[i]);}} //end fori=strlen(s)-1;if(s[i]>47&&s[i]<58){if(s[i-1]>47&&s[i-1]<58){bl=0;insert_sq(&p,a,bl);}else {bl=0;insert_sq(&p,a1,bl);}}bl=1;a=35;insert_sq(&p,a,bl);return (check(*l));}int Operate(int a,int theta, int b){//计算switch(theta) {case 43: return a+b;case 45: return a-b;case 42: return a*b;case 47:{if(b==0){return -2000;}if (a%b==0){return a/b;}else {//printf("不能为小数\n");return -10000;}}default : return 0;}}int ReturnOpOrd(char op,char* TestOp)// precede()函数调用求优先级{int i;for(i=0; i< OPSETSIZE; i++){if (op == TestOp[i]) return i;}return 0;}char precede(char Aop, char Bop){return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];}int initstack(sqstack *s){(s)->base = (int*)malloc(STACK_INIF_SIZE*sizeof(int));if((s)->base==NULL) exit(-2);(s)->top=(s)->base;(s)->stacksize = STACK_INIF_SIZE;return 1;}int gettop(sqstack *s){ //取得栈顶元素int e;if(s->top==s->base){printf("栈空,无法取得栈顶元素!\n");return 0;}e=*(s->top-1);return e;}int push(sqstack *s,int e){ //压栈if(s->top-s->base>=s->stacksize){s->base=(int*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int));if(!s->base) exit(-2);s->stacksize+= STACKINCREMENT;}*(s->top++)=e;return 1;}int pop(sqstack *s,int *e){ //出栈if(s->top==s->base){printf("栈空,出栈错误!\n");return 0;}*e=*(--s->top);return 1;}int EvaluateExpression(char* MyExpression) { // 算法3.4----计算表达式的值// 算术表达式求值的算符优先算法。
// 设OPTR和&&OPND分别为运算符栈和运算数栈int result;sqstack OPTR; // 运算符栈,字符元素sqstack OPND; // 运算数栈,实数元素int c,bl,a,b,theta,top;sqlist *q,l;char *s=MyExpression;init_sq(&l);if(chang(s,&l)!=0){q=&l;initstack(&OPTR);push(&OPTR, 35);initstack (&OPND);q=q->next;c=q->num_ch;bl=q->bol;while ((c!= 35 || gettop(&OPTR)!=35)){if (bl!=1){push(&OPND, c);q=q->next;c=q->num_ch;bl=q->bol;} // 不是运算符则进栈else{top=gettop(&OPTR);switch (precede((char)top, (char)c)){case '<': // 栈顶元素优先权低push(&OPTR, c);q=q->next;c=q->num_ch;bl=q->bol;break;case '=': // 脱括号并接收下一字符pop(&OPTR, &c);q=q->next;c=q->num_ch;bl=q->bol;break;case '>': // 退栈并将运算结果入栈pop(&OPTR, &theta);pop(&OPND, &b);pop(&OPND, &a);push(&OPND, Operate(a, theta, b));break;default :printf("没有这个运算符!\n");return 0;} // switch}//else} // whileresult=gettop(&OPND);return result;}else {printf("你的输入有错误!\n");return 0;}}int randomm()//产生四个随机数{int i=0;srand((unsigned)time(NULL));for (;i<4;i++){number[0][i]=0;number[0][i]=rand();number[0][i]%=13;number[0][i]++;number[1][i]=0;}return number[2][4];}int CalcOneExpress(int expression[][2]) // 计算表达式{// 算术表达式求值的算符优先算法。