亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

打???的地方看得不是很懂,求高人指點一下哈

打???的地方看得不是很懂,求高人指點一下哈

C
牧羊人nacy 2023-04-01 14:10:16
#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#define MAX_SIZE 256enum BOOL{FALSE,TRUE};typedef struct tagOPERATE{double Operand;char Operator;}OPERATE,*LPOPERATE;int IsDigit(char);int isp(char ch); int icp(char ch);int Locate(char ch);void PostSrc(char*src,LPOPERATE lpOperator);int getOperand(char *s,int *len,double *oprd);double Calculate(LPOPERATE lpOperator);static char Operator[]="#(+-*/^"; //?????static int InPriority[]={0,1,3,3,5,5,7}; //????static int OutPriority[]={0,10,2,2,4,4,6}; //?????int Locate(char ch)  {int i=0;for(i=0;Operator[i]!='\0';i++)if(Operator[i]==ch)return i;return -1;}int isp(char ch)  {if('A'<=ch&&'Z'>=ch)return 9;elsereturn InPriority[Locate(ch)];}int icp(char ch)  {if('A'<=ch&&'Z'>=ch)return 8;elsereturn OutPriority[Locate(ch)];}void PostSrc(char*src,LPOPERATE lpOperator){char *p=src,y;LPOPERATE lpOptr=lpOperator;char stack[MAX_SIZE];int top=-1; double Operand;int offset=0;stack[++top]='#';while('\0'!=*p){if(IsDigit(*p)){getOperand(p,&offset,&Operand);p+=offset;lpOptr->Operand=Operand;lpOptr->Operator=0;lpOptr++;}elseif(')'==*p){for(y=stack[top--];y!='(';y=stack[top--])(lpOptr++)->Operator=y;p++;}else{for(y=stack[top--];isp(y)>icp(*p);y=stack[top--]) //?????(lpOptr++)->Operator=y;stack[++top]=y;stack[++top]=*p++;}}while(top!=-1)(lpOptr++)->Operator=stack[top--];  }int IsDigit(char ch){if(('0'<=ch&&'9'>=ch)||'.'==ch)return TRUE;return FALSE;}int getOperand(char *s,int *len,double *oprd){char *p = s,ch = *s++;double z = 0,x = 0;int bits = 0;int point = FALSE;while( IsDigit(ch) == TRUE){if (ch == '.'){if (point == TRUE) return FALSE;point = TRUE;}else {if (point == TRUE){x *= 10;x += ch - '0';bits++;}else {z *= 10;z += ch - '0';}}ch = *s++;}while(bits-- > 0) x /= 10;z += x;*oprd = z;*len = s - p - 1;return TRUE;}
查看完整描述

2 回答

?
搖曳的薔薇

TA貢獻1793條經驗 獲得超6個贊

這個應該是頭文件,但是公共函數應該加上inline優化一下。
enum 枚舉變量 BOOL
結構,包含一個double類型和char類型
int IsDigit(char); //判斷是否是數字(0-9)
int isp(char ch); //判斷是否是字符(A-Z) 返回相應的InPriority數組中值
int icp(char ch); //判斷是否是字符(A-Z) 返回相應的OutPriority數組中值
int Locate(char ch);//判斷是否運算符(+,-,*,/,^) 

猜想一下,這個估計是用來做詞法分析的,分析字符串的運算表達式。
做編譯器?

查看完整回答
反對 回復 2023-04-05
?
胡說叔叔

TA貢獻1804條經驗 獲得超8個贊

static char Operator[]="#(+-*/^"; //?????
運算/操作符。Operator[0]="#" 是 棧操作,push,pop. Operator[1]="(" 是 括號,進入一層。Operator[2]="+",Operator[3]="-",
Operator[4]="*",Operator[5]="/",是 加減乘除,Operator[6]="^" 是冪 運算.
static int InPriority[]={0,1,3,3,5,5,7}; //????
進入/輸入時的優先級
static int OutPriority[]={0,10,2,2,4,4,6}; //?????
退出/輸出時的優先級

for(y=stack[top--];isp(y)>icp(*p);y=stack[top--]) //?????
從棧頂起,往下查一個一個字符,按優先級isp(y)>icp(*p)判斷循環終了。

查看完整回答
反對 回復 2023-04-05
  • 2 回答
  • 0 關注
  • 172 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號