第三章
(1)typedef struct
{ ElemType v[m];
int top[2]
}twostack;
int push(twostack *s,int i, ElemType x)
/* 两栈共享向量空间,i是0或1,表示两个栈,x是进栈元素,*/
/* 本算法是入栈操作 */
{ if (s->top[1] - s->top[0])==1) return(0);/* 栈满 */
else {switch (i)
{case 0: s->v[++(s->top)]=x; break;
case 1: s->v[--(s->top)]=x; break;
default: printf(“栈编号输入错误”);return(0);
}
return(1); /* 入栈成功 */
}
} /* 算法结束 */
ElemType pop(twostack *s,int i)
/* 两栈共享向量空间,i是0或1,表示两个栈,本算法是退栈操作 */
{ ElemType x;
switch (i)
{case 0: if (s->top[0]==-1) return(0);/* 栈空 */
x=s->v[(s->top)--];break;
case 1: if (s->top[1]==m) return(0);/* 栈空 */
x=s->v[(s->top)++];break;
default: printf(“栈编号输入错误”);return(0);
}
return(x); /* 退栈成功 */
}
ElemType top (twostack *s,int i)
/* 两栈共享向量空间,i是0或1,表示两个栈,本算法是取栈顶元素操作 */
{ ElemType x;
switch (i)
{case 0: if (s->top[0]==-1) return(0);/* 栈空 */
x=s->v[s->top];break;
case 1: if (s->top[1]==m) return(0);/* 栈空 */
x=s->v[s->top];break;
default: printf(“栈编号输入错误”);return(0);
}
return(x); /* 取栈顶元素成功 */
}
(4)char EvaluateExpression()
int EvaluateExpression()
{//设OPTR,OPND分别为运算符栈和操作栈
SqStack OPTR,OPND;
char ch,a,b,x,theta;
InitStack(OPTR); InitStack(OPND);//初始化
Push(OPTR,'#');//起始符入栈
ch=getchar();
while(ch!='#'||GetTop(OPTR)!='$')//表达式没有扫描完毕或OPTR栈顶元素不为$
{ if(In(ch)==-1))//是空格
{tt=0;ch=getchar();}
else if(!In(ch)==0)//是数字
{ tt=tt*10+ch-'0'; Push(OPND,tt+'0');// 不是运算符,进OPND栈
ch=getchar(); }
else
{switch(Precede(GetTop(OPTR),ch))//比较OPTR的栈顶元素和ch的优先级
{
case '<':
Push(OPTR,ch); //压入栈,读取下一个字符
ch=getchar(); break;
case '>':
Pop(OPTR,theta); //弹出栈顶元素 运算符
Pop(OPND,b);Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
case '='://OPTR栈顶元素是'('且ch是')'
Pop(OPTR,x);//scanf("%c",&ch);
ch=getchar(); break;
} } }
return GetTop(OPND)-'0';
}
(7)typedef struct {ElemType Q[m] ;
int rear,front; //队尾和队头指针
int tag; //标记, 0为空,1为非空
} CycQueue; //设头 尾指针和标志域的循环队列
void QueueInit (CycQueue cq); //初始化
{cq.tag=0; cq.rear=cq.front=0; }
void QueueIn (CycQueue cq, ElemType x) //若队列不满,则将x插入到队尾
{ if(cq.tag==1 && cq.front==cq.rear)
{ printf("栈满"); exit(0); }
else {cq.rear=(cq.rear+1) % m;
cq.Q[cq.rear]=x;
if (cq.tag==0) cq.tag=1; //由空变不空标记
} }
void QueueOut(CycQueue cq); //若队列非空,则将队头元素出队
{
if (cq.tag==0)
{ printf("栈空"); exit(0); }
else {cq.front=(cq.front+1) % m;
if (cq.front==cq.rear) cq.tag=0; //由不空变队空标记
} }
(10) num=0;//最大值
int max(LinkdList f)
{ if(f) { t=max(t,f->date);num++; }
return t; }
//节点个数
int num(LinkedList f)
{if(f==NULL) return 0;
else return num(f->next)+1; }
//平均值
int aver; sum=0,num=0;
int average(LinkedList f)
{if (f)
{sum+=f->data; num++;
average(f->next); }
return sum/num; } }