1、棧
棧是一種先進先出的數據結構。棧頂進棧,棧頂出棧。
- 數據結構
typedef struct Data{
int value;
int min; //用來記錄棧的最小值
}*DataType;
typedef struct Stack
{
DataType link;//動態數組,或者可以直接用靜態數組
int top;
}Stack;
- 棧的初始化
void InitStack(Stack *s)
{
s->top=0;
s->link=(DataType)malloc(Max*sizeof(struct Data));
}
- 進棧
void Push(Stack *s, int d)
{
if(s->top==Max)
{
printf("棧已滿,無法進棧\n");
return;
}
DataType element=(DataType)malloc(sizeof(struct Data));
element->value=d;
if(s->top==0)
element->min=d;
else
{
element->min=s->link[(s->top)-1].min;
if(s->link[(s->top)-1].min>d)
element->min=d;
}
s->link[s->top]=*element;
s->top++;
}
- 出棧
void Pop(Stack *s)
{
if(s->top==0)
{
printf("棧為空\n");
return;
}
s->top--;
}
- 棧的最小值
int MinStack(Stack *s)
{
return s->link[s->top-1].min;
}
2、隊列
隊列是FIFO(First In Fisrst Out),即先進先出。有隊頭和隊尾兩個指針,分別指向隊列的頭結點和尾結點。隊頭出隊,隊尾入隊。
Paste_Image.png
- 數據結構
typedef struct QNode{
TreeNode Node; //[TreeNode數據結構](http://www.lxweimin.com/p/1343b3e27869)
struct QNode * next;
}QNode,*QueueNode;
typedef struct LinkQueue{
QueueNode front;
QueueNode rear;
}LinkQueue;
- 隊列初始化
void Init(LinkQueue *q)
{
q->front=q->rear=(QueueNode)malloc(sizeof(QNode));//隊列的頭結點(空隊列中只有一個頭結點)
if(!q->front)//申請內存空間失敗
exit(0);
q->front->next=NULL;
}
- 入隊
void EnQueue(LinkQueue *q,TreeNode treenode)
{
QueueNode qnode;
qnode=(QueueNode)malloc(sizeof(QNode));
qnode->Node=treenode;
/****插入隊列****/
qnode->next=q->rear->next;
q->rear->next=qnode;
/****改隊尾指針****/
q->rear=qnode;
}
- 出隊
void DeQueue(LinkQueue *q,TreeNode *node)
{
QueueNode p;
p=q->front->next;//頭結點后一個結點
*node=p->Node;
q->front->next=p->next;
if(q->rear==p) //刪除的是否是最后一個節點
q->rear=q->front;
free(p);
}
- 隊列是否為空
int QueueEmpty(LinkQueue *q)
{
if(q->rear==q->front)//此時隊列中只剩一個頭結點,則隊列為空
return 1;
else
return 0;
}
Paste_Image.png