您的位置:首页 > 其它

栈和队列

2016-04-18 15:29 239 查看
栈的定义:一种特殊的线性表,可以分为链栈,顺序栈。

栈先进后出,以a1为栈底,an为栈顶(由于栈底元素是先进入的)

重点介绍顺序栈:

typedef struct Qnode

{

int data;

int *next;

}Qnode,*Qptr;

typedef struct

{

Qptr base;

Qptr top;

int size;

}Stack;

栈的创建:

bool InitStack(Stack &S)

{

S.base=(Qptr *) malloc (size*sizeof (Qptr) );

if(!S.base) return ERROR;

S.top=S.base;

S.size=MAX_SIZE;

return OK;

}//完成的主要是栈底指针的申请,以及栈的大小

栈的基本操作如压栈、出栈:

bool Push(Stack &S,int e)

{

if(S.top-S.base>=S.size)

{

S.base=(int *)realloc(S.base,(S.size+1)*sizeof(int));

if(!S.base) exit(0);

S.top=S.base+S.size;

S.size+=1;

}

++S.top=e;

return OK;

}

而出栈则是需要先判断是否为空栈,然后e=S.top--;

所以压栈时栈顶指针自加1,出栈时栈顶指针自减1.

队列则是一种先进先出的线性表。以a1表示队头,an表示队尾,队列从队尾插入元素,从队头删除元素,因此其插入删除操作为:

以链队列为例:

设在队尾插入节点的指针域为p,定义队列:

typedef struct Qnode

{

int data;

int *next;

}Qnode,*Qptr;

typedef struct

{

Qptr front;

Qptr rear;

}Queue;

InsertQueue(Queue &S,int e)

{

p=(Qptr)malloc(sizeof(Qnode));

if(!p) exit(0);

p->data=e; p->next=NULL;(即是p->next=Q.rear->next,因为后者就是NULL);

Q.rear->next=p;

//Q.rear=p,此处需要申明队列的尾部。

return OK;

}

DeleteQueue(Queue &S,int e)

{

if(Q.rear==Q.front) return ERROR;

p=Q.front->next;(说明位置)

e=p->data;

Q.front->next=p->next;(注意Q.front是p的前驱节点,p是队头指针,而Q.front是队头的前驱)

return OK;

}

而对于顺序队列(循环队列),其操作与顺序栈类似,在判空的时候不能以Q.front==Q.rear为条件,可以以Q.front->next==Q.rear作为判定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: