-
大小: 128KB文件類(lèi)型: .rar金幣: 2下載: 0 次發(fā)布日期: 2021-06-12
- 語(yǔ)言: 其他
- 標(biāo)簽: 數(shù)據(jù)結(jié)構(gòu)??
資源簡(jiǎn)介
可以計(jì)算包含加減乘除的算術(shù)表達(dá)式,還可以用來(lái)計(jì)算帶小數(shù)的表達(dá)式,表達(dá)式輸入錯(cuò)誤時(shí)會(huì)提示!

代碼片段和文件信息
#include
#include
#include
#define?Max?30
typedef?struct?node1??/*定義符號(hào)棧*/
{
char?data[Max];
int??top;
}SignSeqStack*SignPSeqStack;
typedef?struct?node2??/*定義數(shù)字棧*/
{
double?data[Max];
int??top;
}NoSeqStack*NoPSeqStack;
SignPSeqStack?SInit()???/*符號(hào)棧的初始化*/
{
????SignPSeqStack?s;
????s=(SignPSeqStack)malloc(sizeof(SignSeqStack));
????if(s)
????????s->top=-1;
????return?s;
}?
NoPSeqStack?NInit()???/*數(shù)字棧的初始化*/
{
????NoPSeqStack?s;
????s=(NoPSeqStack)malloc(sizeof(NoSeqStack));
????if(s)
????????s->top=-1;
????return?s;
}?
void?SPush(SignPSeqStack?schar?x)??/*符號(hào)入棧函數(shù)*/
{
if(s->top==Max-1)
{
printf(“表達(dá)式過(guò)長(zhǎng),不能計(jì)算!“);
return;
}
else
{
s->top++;
s->data[s->top]=x;
}
}
void?NPush(NoPSeqStack?sdouble?x)??/*數(shù)字入棧函數(shù)*/
{
if(s->top==Max-1)
{
printf(“表達(dá)式過(guò)長(zhǎng),不能計(jì)算!“);
return;
}
else
{
s->top++;
s->data[s->top]=x;
}
}
void?SPop(SignPSeqStack?Schar?*x)??/*符號(hào)出棧函數(shù)*/
{
if(S->top==-1)
???????return;
else
{
*x=S->data[S->top];
S->top--;
}
}
void?NPop(NoPSeqStack?Sdouble?*x)??/*數(shù)字出棧函數(shù)*/
{
if(S->top==-1)
???????return;
else
{
*x=S->data[S->top];
S->top--;
}
}
char?Priority(char?s1char?s2)???/*判斷運(yùn)算符優(yōu)先級(jí)*/
{
int?irowcol;
static?char?CH[7]={‘+‘‘-‘‘*‘‘/‘‘(‘‘)‘‘#‘}??/*運(yùn)算符*/
R[7][7]={{‘>‘‘>‘‘<‘‘<‘‘<‘‘>‘‘>‘}???????/*運(yùn)算符優(yōu)先關(guān)系*/
?????????????{‘>‘‘>‘‘<‘‘<‘‘<‘‘>‘‘>‘}
?????????????{‘>‘‘>‘‘>‘‘>‘‘<‘‘>‘‘>‘}
?????????????{‘>‘‘>‘‘>‘‘>‘‘<‘‘>‘‘>‘}
?????????????{‘<‘‘<‘‘<‘‘<‘‘<‘‘=‘‘/‘}
?????????????{‘>‘‘>‘‘>‘‘>‘‘/‘‘>‘‘>‘}
?????????????{‘<‘‘<‘‘<‘‘<‘‘<‘‘<‘‘<‘}};
????for(i=0;i<7;i++)
????????if(CH[i]==s1)
{
row=i;
break;
}
for(i=0;i<7;i++)
????if(CH[i]==s2)
{
col=i;
break;
}
if(col<7&&row<7)
return?(R[row][col]);
else
return?‘/‘;
}
void?Symbol(char?*chint?*mSignPSeqStack?SNoPSeqStack?N);
?
void?Digital(char?*chint?*mNoPSeqStack?NSignPSeqStack?S)?/*數(shù)字處理函數(shù)*/
{
int?flag=0;
int?a=0;???/*a用于存放數(shù)字的整數(shù)部分*/
double?b=0.0e=0.1;?/*b用于存放數(shù)字的小數(shù)部分*/
if(ch[*m]==‘-‘)
{
if(!(*m==0||ch[*m-1]==‘(‘))???/*判斷“-”是負(fù)號(hào)還是減號(hào)*/
{
Symbol(chmSN);??/*是減號(hào),處理*/
return;
}
else?
{
flag=1;????/*flag=1表示有負(fù)號(hào)*/
(*m)++;
}
}
for(;ch[*m]>=‘0‘&&ch[*m]<=‘9‘;(*m)++)??/*處理整數(shù)部分*/
{
a*=10;
a+=ch[*m]-‘0‘;?
}
if(ch[*m]==‘.‘)????/*判斷有沒(méi)有小數(shù)*/
for(++(*m);ch[*m]>=‘0‘&&ch[*m]<=‘9‘;(*m)++)??/*處理小數(shù)部分*/
{
double?d;
d=double(ch[*m]-‘0‘);
d*=e;
e*=0.1;
b+=d;
}
(*m)--;
if(flag==1)???/*是負(fù)數(shù),將負(fù)數(shù)入棧*/
????NPush(N0.0-(a+b));
else
NPush(Na+b);
}
void?Symbol(char?*chint?*mSignPSeqStack?SNoPSeqStack?N)??/*符號(hào)處理函數(shù)*/
{
double?abc;
int?i=*m;
char?xy;
y=Priority(S->data[S->top]ch[i]);
if(y==‘/‘)?/*處理符號(hào)*/
{
printf(“你輸入的表達(dá)式不合法!將導(dǎo)致計(jì)算錯(cuò)誤!“);
return?;
}
else?if(y==‘<‘)
{
SPush(Sch[i]);
return;
}
else?if(y==‘=‘)
{
SPop(S&x);
????
?屬性????????????大小?????日期????時(shí)間???名稱(chēng)
-----------?---------??----------?-----??----
?????文件??????50176??2008-03-25?23:21??表達(dá)式求值\表達(dá)式求值.ncb
?????文件??????53248??2008-03-25?23:20??表達(dá)式求值\Debug\vc60.pdb
?????文件?????208986??2008-03-25?23:21??表達(dá)式求值\Debug\表達(dá)式求值.exe
?????文件?????467968??2008-03-25?23:21??表達(dá)式求值\Debug\表達(dá)式求值.pdb
?????文件??????12794??2008-03-25?23:20??表達(dá)式求值\Debug\表達(dá)式求值.obj
?????文件????????254??2008-03-25?23:21??表達(dá)式求值\表達(dá)式求值.plg
?????文件???????4334??2008-01-11?14:48??表達(dá)式求值\表達(dá)式求值.cpp
?????文件???????3451??2008-03-25?23:20??表達(dá)式求值\表達(dá)式求值.dsp
?????文件??????48640??2008-03-25?23:21??表達(dá)式求值\表達(dá)式求值.opt
?????文件????????528??2008-03-25?23:21??表達(dá)式求值\表達(dá)式求值.dsw
?????目錄??????????0??2008-01-10?19:42??表達(dá)式求值\Debug
?????目錄??????????0??2008-01-10?19:42??表達(dá)式求值
-----------?---------??----------?-----??----
???????????????850379????????????????????12
評(píng)論
共有 條評(píng)論