堆栈与队列

来源:互联网 发布:一流网络空间安全学院 编辑:程序博客网 时间:2024/06/07 19:33
堆栈和队列实际上也是线性表,就是线性表的子集而已!

堆栈:
不同于内存中的堆与栈,内存中的堆与栈是两个段。而这里的堆栈是一种线型结构算法。内存中的栈这一段就是利用了堆栈后入先出的算法原理。
堆栈是一种后入先出(LIFO)的。也就是说对于堆栈的插入删除操作都是在表的同一端。
堆栈的实现方法也有顺序表和链表两种方式。
对于链表而言,链表的头结点处插入和删除都很方便,而链表的尾部插入简单,删除比较麻烦。所以对于堆栈的链表方式而言,push和pop都从头部开始比较好。

队列:
不同于堆栈的插入删除操作都是表的同一端,它的插入删除操作要在表的两端。它是一种后入后出(FIFO)结构。
同样的也有顺序表和链表两种形式。
对于顺序表而言,通常使用循环队列形式。

对于链表而言,链表头当做是队列的头,用来删除。链表尾当做队列的尾用来插入。


1.1堆栈的顺序存储

//堆栈是一种特殊的线性表,先入后出,插入和删除是在表的同一端(尾)typedef int Position;struct SNode {    ElementType *Data; /* 存储元素的数组 */    Position Top;      /* 栈顶指针 */    int MaxSize;       /* 堆栈最大容量 */};typedef struct SNode *Stack; Stack CreateStack( int MaxSize ){    Stack S = (Stack)malloc(sizeof(struct SNode));    S->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));    S->Top = -1;    S->MaxSize = MaxSize;    return S;} bool IsFull( Stack S ){    return (S->Top == S->MaxSize-1);} bool Push( Stack S, ElementType X ){    if ( IsFull(S) ) {        printf("堆栈满");        return false;    }    else {        S->Data[++(S->Top)] = X;        return true;    }} bool IsEmpty( Stack S ){    return (S->Top == -1);} ElementType Pop( Stack S ){    if ( IsEmpty(S) ) {        printf("堆栈空");        return ERROR; /* ERROR是ElementType的特殊值,标志错误 */    }    else         return ( S->Data[(S->Top)--] );}

1.2堆栈的链式存储
//堆栈是一种特殊的线性表,先入后出,插入和删除是在表的同一端(尾)//链表的头插入和删除都很方便,链表尾插入方便删除不便。//所以链表的头部当做是堆栈的尾部typedef struct SNode *PtrToSNode;struct SNode {    ElementType Data;    PtrToSNode Next;};typedef PtrToSNode Stack; Stack CreateStack( ) { /* 构建一个堆栈的头结点,返回该结点指针 */    Stack S;     S = (Stack)malloc(sizeof(struct SNode));    S->Next = NULL;    return S;} bool IsEmpty ( Stack S ){ /* 判断堆栈S是否为空,若是返回true;否则返回false */    return ( S->Next == NULL );} bool Push( Stack S, ElementType X ){ /* 将元素X压入堆栈S */    PtrToSNode TmpCell;     TmpCell = (PtrToSNode)malloc(sizeof(struct SNode));    TmpCell->Data = X;    TmpCell->Next = S->Next;    S->Next = TmpCell;    return true;} ElementType Pop( Stack S )  { /* 删除并返回堆栈S的栈顶元素 */    PtrToSNode FirstCell;    ElementType TopElem;     if( IsEmpty(S) ) {        printf("堆栈空");         return ERROR;    }    else {        FirstCell = S->Next;         TopElem = FirstCell->Data;        S->Next = FirstCell->Next;        free(FirstCell);        return TopElem;    }}
2.1队列的顺序存储
//队列是一种特殊的线性表,先入先出,插入和删除是在表的两端//循环队列,数组的第一个位置不存数据,也就是n的数组只存n-1个数typedef int Position;struct QNode {    ElementType *Data;     /* 存储元素的数组 */    Position Front, Rear;  /* 队列的头、尾指针 */    int MaxSize;           /* 队列最大容量 */};typedef struct QNode *Queue; Queue CreateQueue( int MaxSize ){    Queue Q = (Queue)malloc(sizeof(struct QNode));    Q->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));    Q->Front = Q->Rear = 0;    Q->MaxSize = MaxSize;    return Q;}bool IsFull( Queue Q ){    return ((Q->Rear+1)%Q->MaxSize == Q->Front);} bool AddQ( Queue Q, ElementType X ){    if ( IsFull(Q) ) {        printf("队列满");        return false;    }    else {        Q->Rear = (Q->Rear+1)%Q->MaxSize;        Q->Data[Q->Rear] = X;        return true;    }} bool IsEmpty( Queue Q ){    return (Q->Front == Q->Rear);} ElementType DeleteQ( Queue Q ){    if ( IsEmpty(Q) ) {         printf("队列空");        return ERROR;    }    else  {        Q->Front =(Q->Front+1)%Q->MaxSize;        return  Q->Data[Q->Front];    }}
2.2队列的链式存储
//队列是一种特殊的线性表,先入先出,插入和删除是在表的两端//删除是在队列的头删除,插入是在队列的尾插入//链表的头插入和删除都很方便,链表尾插入方便删除不便。//所以队列的头对应链表头,队列尾对应链表的尾typedef struct Node *PtrToNode;struct Node { /* 队列中的结点 */    ElementType Data;    PtrToNode Next;};typedef PtrToNode Position; struct QNode {    Position Front, Rear;  /* 队列的头、尾指针 */    int MaxSize;           /* 队列最大容量 */};typedef struct QNode *Queue; bool IsEmpty( Queue Q ){    return ( Q->Front == NULL);} ElementType DeleteQ( Queue Q ){    Position FrontCell;     ElementType FrontElem;         if  ( IsEmpty(Q) ) {        printf("队列空");        return ERROR;    }    else {        FrontCell = Q->Front;        if ( Q->Front == Q->Rear ) /* 若队列只有一个元素 */            Q->Front = Q->Rear = NULL; /* 删除后队列置为空 */        else                                 Q->Front = Q->Front->Next;        FrontElem = FrontCell->Data;         free( FrontCell );  /* 释放被删除结点空间  */        return  FrontElem;    }}




原创粉丝点击