编写一段c程序,实现多项式的计算,谁能帮我呀,

急需解决!!!!!!!急需解决!!!!!!!... 急需解决!!!!!!!急需解决!!!!!!! 展开
 我来答
隔壁的虫子
2006-11-17 · TA获得超过1336个赞
知道小有建树答主
回答量:614
采纳率:0%
帮助的人:0
展开全部
我可以写个简单的只有+ - * / 幂和括号的多项式的计算
/*
主要是堆栈的应运,把多项式转换为后缀表达式,再计算后缀表达式的值
*/

//中缀表达式转化为后缀表达式的程序

#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!=-1&&opchTb1[i].data!=c;i++)
if(opchTb1[i].code==-1) return 3;
op=&opchTb1.[i];
type=opchTb1.[i].code;
c=*pos++;
}
if(type<5){
if(m!=1) return 1;
m=0;
}
if(type==5) n++;
if(type==6){
if(n--==0) return 2;
if(op->pri>optop->pri)
if(op->data=='(') push(op->code,1,*optop);
else push(op->data,op->code,op->pri,*optop);
else{
while(optop!=NULL&&op->pri<=optop->pri) {
pop(&sop,&code,&optop);
if(code<5&&code>0) {
*numtop++=' ';
*numtop++=sop;
}
}
if(op->data=='\0') return(n!=0||(m!=1&&numtop>num))?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();
}

//后缀表达式的计算
#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函数,这个函数只是计算算法的C语言实现,同时考虑了特定的环境和数据的输入*/
/*输出格式。eval调用了一个isdigit函数,它用来判断其参数是不是一个操作数。在函数eval及其调用的*/
/*pop和push例程中都使用了下面的堆栈说明。eval函数在声明后给出*/

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*/

/*下面的函数在许多C系统中都被预定义为一个宏*/
int isdigit(char symb)
{
return(symb>='0'&&symb<='9');
}

/*函数oper首先检查它的第一个参数是不是一个合法的运算符,如果是,则用另外两个参数来决定运算结果*/
/*对于求幂运算,使用了math.h中定义的函数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*/
速芙问清婉
2019-12-12 · TA获得超过3850个赞
知道大有可为答主
回答量:3252
采纳率:32%
帮助的人:416万
展开全部
我可以写个简单的只有+
-
*
/
幂和括号的多项式的计算
/*
主要是堆栈的应运,把多项式转换为后缀表达式,再计算后缀表达式的值
*/
//中缀表达式转化为后缀表达式的程序
#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!=-1&&opchTb1[i].data!=c;i++)
if(opchTb1[i].code==-1)
return
3;
op=&opchTb1.[i];
type=opchTb1.[i].code;
c=*pos++;
}
if(type<5){
if(m!=1)
return
1;
m=0;
}
if(type==5)
n++;
if(type==6){
if(n--==0)
return
2;
if(op->pri>optop->pri)
if(op->data=='(')
push(op->code,1,*optop);
else
push(op->data,op->code,op->pri,*optop);
else{
while(optop!=NULL&&op->pri<=optop->pri)
{
pop(&sop,&code,&optop);
if(code<5&&code>0)
{
*numtop++='
';
*numtop++=sop;
}
}
if(op->data=='\0')
return(n!=0||(m!=1&&numtop>num))?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();
}
//后缀表达式的计算
#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函数,这个函数只是计算算法的C语言实现,同时考虑了特定的环境和数据的输入*/
/*输出格式。eval调用了一个isdigit函数,它用来判断其参数是不是一个操作数。在函数eval及其调用的*/
/*pop和push例程中都使用了下面的堆栈说明。eval函数在声明后给出*/
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*/
/*下面的函数在许多C系统中都被预定义为一个宏*/
int
isdigit(char
symb)
{
return(symb>='0'&&symb<='9');
}
/*函数oper首先检查它的第一个参数是不是一个合法的运算符,如果是,则用另外两个参数来决定运算结果*/
/*对于求幂运算,使用了math.h中定义的函数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*/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式