輔助定義:
#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;