本文目录一览:
如何用C语言数据结构的格式实现简单的算术表达式求值程序
用栈把中缀表达式(输入的式子)按优先级转为后缀表达式(逆波兰式,即运算符在前,操作数在后),再利用栈变计算边保存结果用于下一步计算,最后算出式子的答案
以下代码输入一个式子(以
=
作为输入结束标志),输出结果,负数如-3用0-3表示,支持高位运算
#include
stdio.h
#include
stdlib.h
#include
math.h
#include
malloc.h
#define
OK
1
#define
ERROR
-1
typedef
char
SElemType;
typedef
char
Status;
#define
STACK_INIT_SIZE
100000
#define
STACKINCREMENT
2
struct
SqStack
{
SElemType
*base;
SElemType
*top;
int
stacksize;
};
struct
SqStack1
{
int
*base;
int
*top;
int
stacksize;
};
SqStack
OPTR;
SqStack1
OPND;
char
Precede(char
c1,char
c2)
{
if(c1=='+'
||
c1=='-')
{
if(c2=='+'
||
c2=='-'
||
c2==')'
||
c2=='=')
return
'';
else
return
'';
}
else
if(c1=='*'
||
c1=='/')
{
if(c2=='(')
return
'';
else
return
'';
}
else
if(c1=='(')
{
if(c2==')')
return
'=';
else
return
'';
}
else
if(c1==')')
return
'';
else
if(c1=='=')
{
if(c2=='=')
return
'=';
else
return
'';
}
else
return
'\0';
}
int
In(char
c)
{
if(c=='+'
||
c=='-'
||
c=='*'
||
c=='/'
||
c=='('
||
c==')'
||
c=='=')
return
1;
else
return
0;
}
int
Operrate(int
m,char
b,int
n)
{
switch(b)
{
case
'+':return
m+n;
case
'-':return
m-n;
case
'*':return
m*n;
case
'/':return
m/n;
}
return
0;
}
//操作数
int
InitStack1(SqStack1
S)
{
S.base=(int
*)malloc(STACK_INIT_SIZE*sizeof(int));
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return
OK;
}
int
Push1(SqStack1
S,int
e)
{
if(S.top-S.base=S.stacksize)
{
S.base=(int
*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
S.top=S.base+S.stacksize;
S.stacksize=S.stacksize+STACKINCREMENT;
}
*S.top++=e;
return
OK;
}
int
Pop1(SqStack1
S,int
e)
{
if(S.top==S.base)
return
ERROR;
e=*
--S.top;
return
OK;
}
int
GetTop1(SqStack1
S)
{
if(S.top==S.base)
return
ERROR;
return
*(S.top-1);
}
//算符
int
InitStack(SqStack
S)
{
S.base=(SElemType
*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return
OK;
}
int
Push(SqStack
S,SElemType
e)
{
if(S.top-S.base=S.stacksize)
{
S.base=(SElemType
*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
S.top=S.base+S.stacksize;
S.stacksize=S.stacksize+STACKINCREMENT;
}
*S.top++=e;
return
OK;
}
int
Pop(SqStack
S,SElemType
e)
{
if(S.top==S.base)
return
ERROR;
e=*
--S.top;
return
OK;
}
Status
GetTop(SqStack
S)
{
if(S.top==S.base)
return
ERROR;
return
*(S.top-1);
}
int
Calculate()
{
char
c,theta,p;
int
a,b,i=0,ans,x;
InitStack(OPTR);
Push(OPTR,'=');
InitStack1(OPND);
c=getchar();
while(c!='='
||
GetTop(OPTR)!='=')
{
if(!In(c)
c='0'
c='9')
{
Push1(OPND,c-'0');
c=getchar();
while(c='0'
c='9')
{
Pop1(OPND,x);
Push1(OPND,x*10+c-'0');
c=getchar();
}
}
else
if(In(c))
{
switch(Precede(GetTop(OPTR),c))
{
case
'':
Push(OPTR,c);
c=getchar();
break;
case
'=':
Pop(OPTR,p);
c=getchar();
break;
case
'':
Pop(OPTR,theta);
Pop1(OPND,b);
Pop1(OPND,a);
ans=Operrate(a,theta,b);
Push1(OPND,ans);
break;
}
}
else
{
c=getchar();
}
}
return
GetTop1(OPND);
}
int
main()
{
int
ans;
ans=Calculate();
printf("%d\n",ans);
return
0;
}
关于c语言数据结构 insertlist插入算法
您的sort函数有错误。如果我没有讲明白可以联系我。
void
sort(seqlist
*p,int
i,int
e)//将元素e传入到数组的第i个位序前
{
int
j;
//if(p-n10)
if(p-n10)//判断语句为p-n应该小于10才不会溢出
for(j=p-n;j=i;j--)
{
p-b[j]=p-b[j-1];//将第i个位置以后的元素依次后移
//p-b[i-1]=e;
//p-n=p-n+1;
}
p-b[i-1]=e;//只要在最后插入一次就可以了。
p-n=p-n+1;//p-n=p-n+1只需运行一次。
}
C语言如何实现将IP地址字符串与组成IP地址的4个数字互相转换?
你要知道你平常用的ip地址存入计算机并不是点分形式的,是uint32类型的,当你需要取得这个点分形式的ip地址,你需要调用inte_ntoa,他的参数是in_addr,你要知道in_addr不是一个基本类型,它是一个结构体,里面有个成员,你把他的值设成那个uint32类型的ip,再调用inet_ntoa,算的结果就是点分形式的ip了