[c]代码库
// 两个栈共享一个一维数组空间SPACE【N】,
//栈底分别为SPACE[0] SPACE[N-1]
//(1) 分别写出入栈 出栈的语句
//(2)分别写出栈满 栈空的条件
#define Maxszie 100
typedef struct Stack{
int data[Maxsize];
int top;
}*SqStack;
//元素X入栈1
int PUSH(SqStack *S1,SqStack *S2,int x)
{
if(((*S2)->top-(*S1)->top)==1) //判断栈满
return ERROR;
(*S1)->top++;
(*S1)->data[(*S1)->top]=x;
return OK;
}
//元素x出栈1
int POP(SqStack *S1,int *x)
{
if((*S1)->top==-1) //判断栈空
return ERROR;
*x=(*S1)->data[(*S1)->top];
(*S1)->top--;
return OK;
}
//元素x入栈2
int PUSH(SqStack *S2,SqStack *S1,int x)
{
if(((*S2)->top-(*S1)->top)==1) //判断栈满
return ERROR;
(*S2)->top--;
(*S2)->data[(*S2)->top]=x;
return OK;
}
//元素x出栈2
int POP(SqStack *S2,SqStack *S1,int *x)
{
if((*S2)->top==N) //判断栈空
return ERROR;
*x=(*S2)->data[(*S2)->top];
(*S2)->top++;
return OK;
}
//用循环数组q[M]表示队列
//该队列只有头指针front,没有尾指针rear,并改用计数器count用以记录队列中的结点个数
//(1)编写实现队列判空 入队 出队
//(2)队列最多能容纳元素个数
#define Maxsize 100
typedef struct{
int data[Maxsize];
int front; //头指针
int count; //记录结点个数
}*SqQueue;
//队列判空
int QueueEmpty(SqQueue *Q)
{
if((*Q)->count==0)
return 0;
return 1;
}
//入队
int EnQueue(SqQueue *Q,int x)
{
int i=0;
if((*Q)->count==(M-1)) //判断队满
return ERROR;
(*Q)->count++;
i=((*Q)->front+(*Q)->count)/Maxsize;
(*Q)->data[i]=x;
return OK;
}
//出队
int DeQueue(SqQueue *Q,int *x)
{
int i;
if((*Q)->count==0) //判断队空
return ERROR;
*x=(*Q)->data[(*Q)->front];
(*Q)->front=((*Q)->front+1)/Maxsize;
(*Q)->count--;
return OK;
}
//允许循环队列在两端都可以进行插入和删除操作
//(1)写出循环队列的类型定义
//写出"从队尾删除"和"从对头插入"的算法
#define Maxsize 100
typedef struct{
int data[Maxsize];
int front;
int rear;
int flat; //如果flat为Maxsize时,队满 flat为0时 队空
}*SqQueue;
//从队尾删除
int DeQueueRear(SqQueue *Q,int *x)
{
if((*Q)->flat==0) //判断队空
return ERROR;
*x=(*Q)->data[(*Q)->rear];
(*Q)->rear=((*Q)->rear-1)/Maxsize;
(*Q)->flat--;
return OK;
}
//从队头插入元素
int EnQueueFront(SqQueue *Q,int x)
{
if((*Q)->flat==Maxsize) //判断队满
return ERROR;
(*Q)->front=((*Q)->front-1)/Maxsize;
(*Q)->data[(*Q)->front];
(*Q)->flat++;
return OK;
}