線性表(棧/隊列)

輔助定義:

#define MAXSIZE 5
#define OK      0
#define ERROR   1

typedef int SElemType;
typedef int Status;


棧(順序/鏈式)

相關結構體定義:

//順序棧
typedef struct
{
    SElemType data[MAXSIZE];
    int top;
}SqStack;
//順序棧共享空間
typedef struct
{
    SElemType data[MAXSIZE];
    int top1;
    int top2;
}SqDoubleStack;
//鏈棧節點
typedef struct StackNode
{
    SElemType data;
    struct StackNode *next;
}StackNode, *pStackNode;
//棧結構體
typedef struct
{
    pStackNode top;//棧頂指針
    int count;//棧中元素個數
}LinkStack;


兩個順序棧共享空間,在數據插入的實現:

Status PushDouble(SqDoubleStack *S, SElemType e, int stackNumber)
{
    if (!S || S->top1 + 1 == S->top2) {
        return ERROR;
    }
    if (stackNumber == 1) {//數據插入前面一個棧
        S->top1++;
        S->data[S->top1] = e;
        return OK;
    }else if(stackNumber == 2){//數據插入後面一個棧
        S->top2--;
        S->data[S->top2] = e;
        return OK;
    }
    return ERROR;
}


鏈棧插入與彈出操作:

Status PushLinkStack(LinkStack *S, SElemType e)
{
    pStackNode s = (pStackNode)malloc(sizeof(StackNode));
    s->data = e;
    s->next = S->top;
    
    S->top = s;
    S->count++;
    
    return OK;
}
Status PopLinkStack(LinkStack *S, SElemType *e)
{
    if (!S || S->count < 1) {
        return ERROR;
    }
    pStackNode p = S->top;
    *e = S->top->data;
    S->top = S->top->next;
    free(p);
    S->count--;
    return OK;
}

隊列(順序/鏈式)

隊列順序存儲(循環隊列)

這樣可以防止假溢出,並且充分利用空間。設置兩個指針,front指向隊列的頭,rear指向隊列尾部元素的下一個位置,當隊列滿時,隊列還存在一個空間,用來存放rear指針。如圖:


隊列空的時候:front == rear;隊列滿時:(rear+1)%QueueSize == front。(QueueSize是隊列長度)

隊列長度:(rear - front + QueueSize)%QueueSize。

//循環隊列結構
typedef struct
{
    ElemType data[MAXSIZE];
    int front;
    int rear;
}SqQueue;
//初始化
Status InitQueue(SqQueue *Q)
{
    Q->front = 0;
    Q->rear = 0;
    return OK;
}

隊列的鏈式存儲

相當於單鏈表,入隊相當於在單鏈表尾部插入數據,出隊相當於在單鏈表頭部刪除數據。下面給出其結構體定義,具體實現可參考單鏈表操作。

//隊列的鏈式存儲節點
typedef struct QueueNode
{
    SElemType data;
    struct QueueNode *next;
}QueueNode, *pQueueNode;
//隊列的鏈式存儲
typedef struct
{
    pQueueNode front, rear;
    int count;
}Queue, *pQueue;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章