堆栈的顺序存储实现

堆栈的顺序存储实现其实是利用了定长数组来模拟堆栈先进后出的规则,由此决定了堆栈的固定容量, 同时需要两个头尾指针来指示栈顶和栈底的位置。

以下展示各部分的代码实现。

  • 定义结构体
1
2
3
4
5
6
7
typedef int Position;
struct QNode {
ElementType *Data; /* 存储元素的数组 */
Position Front, Rear; /* 队列的头、尾指针 */
int MaxSize; /* 队列最大容量 */
};
typedef struct QNode *Queue;
  • 创建队列
1
2
3
4
5
6
7
8
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;
}
  • 判断堆栈队列是否已满
1
2
3
4
bool IsFull( Queue Q )
{
return ((Q->Rear+1)%Q->MaxSize == Q->Front);
}
  • 添加栈顶元素
1
2
3
4
5
6
7
8
9
10
11
12
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;
}
}
  • 判断堆栈是否为空
1
2
3
4
bool IsEmpty( Queue Q )
{
return (Q->Front == Q->Rear);
}
  • 弹出栈顶元素
1
2
3
4
5
6
7
8
9
10
11
ElementType DeleteQ( Queue Q )
{
if ( IsEmpty(Q) ) {
printf("队列空");
return ERROR;
}
else {
Q->Front =(Q->Front+1)%Q->MaxSize;
return Q->Data[Q->Front];
}
}

堆栈的链式存储实现

堆栈的链式结构实现原理是将栈中的每一个元素视为链表中的每一个结点,利用链表的尾部的增删来实现先进后出的堆栈特点。

  • 定义结构体
1
2
3
4
5
6
typedef struct SNode * PtrToSNode;
struct SNode {
ElementType Data;
PtrToSNode Next;
};
typedef PtrToSNode Stack;
  • 创建一个链式堆栈
1
2
3
4
5
6
7
8
Stack CreateStack( ) 
{ /* 构建一个堆栈的头结点,返回该结点指针 */
Stack S;

S = (Stack)malloc(sizeof(struct SNode));
S->Next = NULL;
return S;
}
  • 判断堆栈链表是否为空
1
2
3
4
bool IsEmpty ( Stack S )
{ /* 判断堆栈S是否为空,若是返回true;否则返回false */
return ( S->Next == NULL );
}
  • 元素压入栈顶
1
2
3
4
5
6
7
8
9
10
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;
}
  • 弹出栈顶元素

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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;
    }
    }