目录
1、顺序栈
1.1 顺序栈的表示
#define MAXSIZE 100 typedef struct{ SElemType *base//栈底元素 SELemType *top//栈顶元素 int stacksize//栈可用最大内存 }SqStack
1.2 顺序栈的初始化
Status InitStack(SqStack &S){//构造一个空栈 S.base = new SElemType[MAXSIZE]; //S.base = (SELemType*)malloc(MAXSIZE*sizeof(SElemType)); if(!S.base)exit (OVERFLOW);//存储分配失败 S.top = S.base; S.stacksize = MAXSIZE; return OK; }
1.3 顺序栈判断栈是否为空
Status StackEmpty(SqStack S){ if(S.top == S.base) return TRUE; else return FALSE }
1.4 求顺序栈长度
int StackLength(SqStack S){ return S.top-S.base }
1.5 清空顺序栈
Status ClearStack(SqStack S){ if(S.base) S.top = S.base; return OK; }
1.6 销毁顺序栈
Status DestroyStack(SqStack &S){ if(S.base){ delete S.base; S.stacksize = 0; S.base = S.tip = NULL; } return OK; }
1.7 顺序栈的入栈
Status Push(SqStack &S,SElemType e){ if(S.top - S.base == S.stacksize)//栈满 return ERROR; *S.top = e; S.top++; //*S.top++ = e; return Ok; }
1.8 顺序栈的出栈
Status Pop(SqStack &S,SElemType e){ if(S.top == S.base)//栈空 return ERROR; --S.top; e=*S.top; //e = *--S.top; return Ok; }
2、链栈
2.1 链栈的定义
typedef struct StcakNode{ SelemType data; struct StcakNode *next; }StackNode,*LInkStack; LinkStack S;
2.2 链栈的初始化
void InitStack(LinkStack &S){ //构造一个空栈,栈顶指针置空 S = NULL; return OK; }
2.3 判断链栈是否为空
Status StackEmpty(LinkStack S){ if(S == NUll) return TRUE; else return FALSE }
2.4 链栈的入栈
Status Push(LinkStack &S,SElemType e){ p = new StackNode //生成新结点P p->data = e; //将新结点数据域置为e p->next = s; //将新结点插入栈顶 S=p; //修改栈顶指针 return OK; }
2.5 链栈的出栈
Status Push(LinkStack &S,SElemType &e){ if(S == NULL) return ERROR; e = S->data; p = S; S = S->next; delete p; return OK; }
2.6 取栈顶元素
Status Push(LinkStack &S,SElemType &e){ if(S != NULL) return S->data; }
3、顺序循环队列
3.1 循环队列的初始化
Status InitQueue (SqQueue &Q){ Q.base = new QElemType[MAXQSIZE];//分配数组空间 if(!Q.base) exit(OVERFLOW); //存储配置失败 Q.front = Q.rear = 0; //头尾指针置为0,队列位空 return OK; }
3.2 求循环队列的长度
int QueueLength (SqQueue Q){ return(Q.rear-Q.front + MAXQSIZE) % MAXQSIZE }
3.3 循环队列 入队
Status EnQueue (SqQueue &Q,QElemType e){ if((Q.rear+1)%MAXQSIZE == Q.front) return ERROR;//队满 Q.base[Q.rear] =x;//插入元素放在尾指针指向的位置 Q.rear = (Q.rear + 1) % MAXSIZE //队尾指针加一 }
3.4 循环队列 出队
Status DeQueue (SqQueue &Q,QElemType &e){ if(Q.rear == Q.front) return ERROR;//队空 x = Q.base[Q.front];//头指针指向的元素赋值给x Q.front = (Q.front + 1) % MAXSIZE }
3.5 顺序队列取队头元素
SElemType GetHead(SqQuere Q){ if(Q.front != Q.rear)//队列不为空 return Q.base[Q.front];//返回队头指针元素的值,队头指针不变 }
4、链队
4.1 链队的类型定义
#define MAXSIZE 100//最大队列长度 typedef struct Qnode{ QElemType data; struct Qnode *next; }QNode,*QuenePtr;typedef struct{ QuenePtr front;//队头指针 QuenePtr rear;//队尾指针 }LinkQueue;
4.2 链队列初始化
Status InitQueue(LinkQueue &Q){ Q.front = Q.rear = (QueuePtr)malloc(sizeog(QNode)); if(!Q.front) exit(OVERFLOW); Q.front->next = NULL; return OK; }
4.3 销毁链队列
Status DestroyQueue(LinkQueue &Q){ while(Q.front){ p=Q.front->next; free(Q.front); Q.front=p; } }
4.4 将元素e入队
Status EnQueue(LinkQueue &Q,QElemType e){ p=(QueuePtr)malloc(sizeof(QNode)); if(!p) exit(OVERFLOW); p->data = e;p->next = NULL; Q.rear->next = p;//原尾指针的下一个指针域 Q.rear = p;//将p作为尾指针 return OK; }
4.5 链队列出队
Status DeQueue(LinkQueue &Q,QElemType &e){ if(Q.front==Q.rear) return ERROR; p=Q.front->next; e=p->data; Q.front->next=p->next; if(Q.rear==p) Q.rear = Q.front; delete p; return OK; }
4.6 求链队列的队头元素
Status GetHead(LinkQueue Q,QElemType &e){ if(Q.front ==Q.rear) return ERROR; e=Q>front->next->data; return OK; }