我可以寫(xiě)個(gè)簡(jiǎn)單的只有+ - * / 冪和括號(hào)的多項(xiàng)式的計(jì)算
創(chuàng)新互聯(lián)的客戶(hù)來(lái)自各行各業(yè),為了共同目標(biāo),我們?cè)诠ぷ魃厦芮信浜?,從?chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對(duì)我們的要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。專(zhuān)業(yè)領(lǐng)域包括成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、電商網(wǎng)站開(kāi)發(fā)、微信營(yíng)銷(xiāo)、系統(tǒng)平臺(tái)開(kāi)發(fā)。
/*
主要是堆棧的應(yīng)運(yùn),把多項(xiàng)式轉(zhuǎn)換為后綴表達(dá)式,再計(jì)算后綴表達(dá)式的值
*/
//中綴表達(dá)式轉(zhuǎn)化為后綴表達(dá)式的程序
#include stdio.h
#include ctype.h
#include stdlib.h
typedef struct node
{
char data; int code; int pri;
struct node *link;
}NODE;
struct Tb1
{
char data; int code; int pri;
}opchTb1[]={{'*',1,4},{'/',2,4},{'+',3,2},{'-',4,2},{'(',5,5},{')',6,1},{'\0',7,0},{'#',-1,0}};
NODE *optop;
char num[200], *numtop;
char expStr[200];
void push(char x,int c,int p,NODE **toppt)
{
NODE *q=(NODE *)malloc(sizeof(NODE));
q-data=x;
q-code=c;
q-pri=p;
q-link=*toppt;
*toppt=q;
}
int pop(char *op,int *cp, NODE **toppt)
{
NODE *q=*toppt;
if(*toppt==NULL) return 1;
*op=q-data;
*cp=q-code;
*toppt=q-link;
free(q);
return 0;
}
int expr(char *pos)
{
struct Tb1 *op;
char sop;
int type,code,n,m,i,c;
optop=NULL;
numtop=num;
n=m=0;
c=' ';
push('#',0,0,*optop);
while(1){
while(c==' '||c=='\t') c=*pos++;
if(isalpha(c)){
*numtop++=' ';
while(isalpha(c)||isdigit(c)) {*numtop++=c;c=*pos++;}
if(m) return 1;
m=1;
continue;
}
else {
for(i=0;opchTb1[i].code!=-1opchTb1[i].data!=c;i++)
if(opchTb1[i].code==-1) return 3;
op=opchTb1.[i];
type=opchTb1.[i].code;
c=*pos++;
}
if(type5){
if(m!=1) return 1;
m=0;
}
if(type==5) n++;
if(type==6){
if(n--==0) return 2;
if(op-prioptop-pri)
if(op-data=='(') push(op-code,1,*optop);
else push(op-data,op-code,op-pri,*optop);
else{
while(optop!=NULLop-pri=optop-pri) {
pop(sop,code,optop);
if(code5code0) {
*numtop++=' ';
*numtop++=sop;
}
}
if(op-data=='\0') return(n!=0||(m!=1numtopnum))?4:(*numtop='\0');
else if(op-data!=')') push(op-data,op-code,op-pri,optop);
}
}
}
void main()
{
int d;
printf("please input the string!\n");
gets(expStr);
if((d=expr(expStr))==0) printf("the postfix string is:%s\n",num);
else printf("The string error! the error is:%d\n",d);
getch();
}
//后綴表達(dá)式的計(jì)算
#include stdio.h
#include stdlib.h
#include math.h
#define MAXCOLS 80
#define TRUE 1
#define FLASE 0
double eval(char[]);
double pop(struct stack *ps);
void push(struct stack *ps,double x);
int empty(struct stack *ps);
int isdigit(char);
double oper(int,double,double);
void main()
{
char expr[MAXCOLS];
int position=0;
printf("\nPlease input the string:");
while((expr[position++]=getchar())!='\n');
expr[--position]='\0';
printf("%s%s","the original postfix expression is",expr);
printf("\n%f",eval(expr));
getch();
} /*end main*/
/*程序的主要部分eval函數(shù),這個(gè)函數(shù)只是計(jì)算算法的C語(yǔ)言實(shí)現(xiàn),同時(shí)考慮了特定的環(huán)境和數(shù)據(jù)的輸入*/
/*輸出格式。eval調(diào)用了一個(gè)isdigit函數(shù),它用來(lái)判斷其參數(shù)是不是一個(gè)操作數(shù)。在函數(shù)eval及其調(diào)用的*/
/*pop和push例程中都使用了下面的堆棧說(shuō)明。eval函數(shù)在聲明后給出*/
struct stack{
int top;
double items[MAXCOLS];
};
double eval(char expr[])
{
int c,position;
double opnd1,opnd2,value;
struct stack opndstk;
opndstk.top=-1;
for(position=0;(c=expr[position])!='\0';position++)
if(isdigit(c)) /*operand--convert the character representation of the digit into double and*/
/*push it onto the stack*/
push(opndstk,(double)(c-'0'));
else{ /*operator*/
opnd2=pop(opndstk);
opnd1=pop(opndstk);
value=oper(c,opnd1,opnd2);
push(opndstk,value);
} /*end else*/
return(pop(opndstk));
}/*end eval*/
/*下面的函數(shù)在許多C系統(tǒng)中都被預(yù)定義為一個(gè)宏*/
int isdigit(char symb)
{
return(symb='0'symb='9');
}
/*函數(shù)oper首先檢查它的第一個(gè)參數(shù)是不是一個(gè)合法的運(yùn)算符,如果是,則用另外兩個(gè)參數(shù)來(lái)決定運(yùn)算結(jié)果*/
/*對(duì)于求冪運(yùn)算,使用了math.h中定義的函數(shù)pow(op1,op2)。*/
double oper(int symb,double op1,double op2)
{
switch(symb){
case '+' : return(op1+op2);
case '-' : return(op1-op2);
case '*' : return(op1*op2);
case '/' : return(op1/op2);
case '$' : return(pow(op1,op2));
default:printf("%s","illegal operation");
exit(1);
}/*end switch*/
}/*end oper*/
double pop(struct stack *ps)
{
if(empty(ps)){
printf("%s","stack underflow");
exit(1);
} /*end if*/
return(ps-items[ps-top--]);
}/*end pop*/
void push(struct stack *ps,double x)
{
ps-items[++(ps-top)]=x;
return;
} /*end push*/
int empty(struct stack *ps)
{
return(ps-top==-1);
}/*end empty*/
matlab的代碼是解釋運(yùn)行的
所以可以在命令行用交互式地一句一句輸入命令和運(yùn)行命令
本身你在命令行輸入的命令就是一串字符串
matlab 負(fù)責(zé)解釋和執(zhí)行命令
而eval('str')就是執(zhí)行str字符串內(nèi)容的指令
實(shí)際上跟你在命令行輸入str內(nèi)容后按回車(chē)執(zhí)行命令是一樣的
而c語(yǔ)言運(yùn)行之前是需要先將代碼整體編譯再運(yùn)行的
不存在像matlab一樣解釋運(yùn)行的機(jī)制,所以沒(méi)有類(lèi)似的eval函數(shù)
用C語(yǔ)言實(shí)現(xiàn)類(lèi)似的功能就比較麻煩了
eval_r()函數(shù)的功能就是將括號(hào)內(nèi)的字符串視為語(yǔ)句并運(yùn)行
例如: eval_r('y1=sin(2)')就是相當(dāng)于在matlab命令窗口輸入了y1=sin(2)這條命令。
C和C++是沒(méi)有eval的,不過(guò)可以自己實(shí)現(xiàn)一個(gè)。一般的算式計(jì)算還是比較好實(shí)現(xiàn)的。C++的優(yōu)勢(shì)在別的地方,僅僅是沒(méi)有類(lèi)似eval的函數(shù)并不代表C語(yǔ)言就是一門(mén)差語(yǔ)言。