栈相关操作的算法总结
顺序栈
1.栈的顺序存储表示
#define MAXSIZE
typedef struct
{
SElemType *base;
SElemType *top;
int stackSize;
}SqStack;
1.顺序栈初始化
void InitStack(SqStack &S)
{
S.base = new SElemType[MAXSIZE];
if(!S.base)
exit(OVERFLOW);
S.top = S.base;
S.stackSizie = MAXSIZE;
}
2.判断顺序栈是否为空
bool StackEmpty(SqStack S)
{
if(S.top == S.base)
return true;
else
reurn false;
}
3.求顺序栈的长度
int StackLength(SqStack S)
{
return S.top - S.base;
}
4.清空顺序栈
void ClearStack(SqStack &S)
{
if(S.base)
S.base = S.top;
}
5.销毁顺序栈
void DestroyStack(SqStack &S)
{
if(S.base)
{
delete(S.base);
S.stackSize = 0;
S.base = S.top = NULL;
}
}
6.入栈
void Push(SqStack &S,SElemType e)
{
if(S.top-S.base == S.stackSize)
return ERROR;
*S.top++ = e;
}
7.出栈
void Pop(SqStack &S,SElemType &e)
{
if(S.top == S.base)
return ERROR;
e = *--S.top;
}
8.取栈顶元素
void GetTop(SqStack S,SElemType &e)
{
if(S.top == S.base)
return ERROR;
e = *(S.top-1);
}
链栈
1.栈的链式存储表示
typedef struct StackNode
{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStack;
2.链栈的初始化
void InitStack(LinkStack &S)
{
S = NULL;
}
3.判断链栈是否为空
bool StackEmpty(LinkStack S)
{
if(S == NULL)
return true;
else
return false;
}
4.链栈进栈
void Push(LinkStack &S,SElemType e)
{
p = new StackNode;
if(!p)
exit(OVERFLOW);
p->data = e;
p->next = S;
S = p;
}
8.链栈出栈
void Pop(LinkStack &S,SElemType &e)
{
if(S == NULL)
return ERROR;
e = S->data;
p = S;
S = S->next;
delete p;
}
队列相关操作的算法总结
链队
1.队列的链式存储结构
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr *front;
QueuePtr *rear;
}LinkQueue;
2.初始化链队
void InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = new QNode;
Q.front->next = NULL;
}
3.销毁链队
void DestroyQueue(LinkQueue &Q)
{
while(Q.front)
{
Q.rear = Q.front->next;
delete Q.front;
Q.front = Q.rear;
}
}
4.判断链队是否为空
bool QueueEmpty(LinkQueue Q)
{
if(Q.front == Q.rear)
return true;
else
return false;
}
5.求链队的队头元素
void GetHead(LinkQueue Q,QElemType &e)
{
if(Q.front == Q.rear)
return ERROR;
e = Q.front->next->data;
}
6.入队操作
void EnQueue(LinkQueue &Q,QElemType e)
{
p = new QNode;
p->data = e;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
}
7.出队操作
void DeQueue(Queue &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;
}
循环队列
1.循环队列的存储结构
#define MAXSIZE 100
typedef struct
{
QElemType *base;
int front;
int rear;
}SqQueue;
2.循环队列初始化
void InitQueue(SqQueue &Q)
{
Q.base = new QElemType[MAXSIZE];
if(!Q.base)
exit(OVERFLOW);
Q.front = Q.rear = 0;
}
3.求循环队列的长度
int QueueLength(SqQueue Q)
{
return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;
}
4.循环队列入队
void EnQueue(SqQueue &Q,QElemType e)
{
if((Q.rear+1)%MAXSIZE == Q.front)
return ERROR;
Q.base[Q.rear] = e;
Q.rear = (Q.rear+1)%MAXSIZE;
}
5.循环队列出队
void DeQueue(SqQueue &Q,QElemType &e)
{
if(Q.front == Q.rear)
return ERROE;
e = Q.base[Q.front];
Q.front = (Q.front+1)%MAXSIZE;
}