#include<malloc.h> #include<stdlib.h> #include<stdio.h> #define MAXSIZE 100 typedef struct node { char data; struct node*lc; struct node*rc; }Node, *BiTree;//二叉鏈表的數據元素 typedef struct { Node*node; int layer; }BTNRecord;//隊列的數據元素 typedef struct { Node *stack[MAXSIZE]; int top; }BStack, *Stack;//棧的數據元素 //基本操作 // 棧初始化 Stack InitStack() { Stack S; S = (BStack*)malloc(sizeof(BStack)); if (S) S->top = -1; else printf("Init stack error!\n"); return S; } int StackEmpty(Stack S) //判斷棧是否為空 { if (S->top == -1) //若為空,則返回 return 1; else return 0; } int StackFull(Stack S) //判斷棧是否滿 { if (S->top == MAXSIZE - 1) //棧滿則返回 return 1; else return 0; } void Push(Stack &S, Node *e) //進棧操作,因為棧要發生變化,所以棧要用引用型 { if (!(StackFull(S))) //進棧之前要判斷棧是否滿,若滿,則不能進棧 { S->top++; // 先移動棧頂指針,再壓入元素 S->stack[S->top] = e; } else return; } void Pop(Stack &S) //出棧 { if (S->top==-1) //出棧之前要判斷棧是否空,若空,返回空指針 { return; } //移動棧頂指針 S->top--; } Node* GetTop(Stack S) { if (StackEmpty(S)) return NULL; else return S->stack[S->top]; } void Free(Stack &S) { free(S); }
棧的基本操作算法的實現
以上棧的實現可以用於二叉樹的先序遍歷和中序遍歷非遞歸算法的實現。
因為二叉樹的后序非遞歸遍歷算法的實現較前面兩種相對復雜,故給出了另外一種新的棧的實現。
其實只是存儲元素稍微有些不同。其他的基本操作實現差不多一樣。
基本代碼如下:
后序非遞歸遍歷實現所需要的棧的結構
// 棧的數據結構
// 棧元素類型
typedef struct
{
BiNode *q; // 存放結點地址
int tag; // 存放當前狀態位
}SNode;
typedef struct
{
SNode stack[maxn]; // 存儲節點數組
int top; // 棧頂指針
}BStacks,*Stacks;
// 棧初始化
Stacks InitStacks()
{
Stacks S;
S=(BStacks*)malloc( sizeof (BStacks));
if (S)
S->top=-1;
else
printf( "Init stack error!\n" );
return S;
}
int StacksEmpty(Stacks S) //判斷棧是否為空
{
if (S->top==-1) //若為空,則返回
return 1;
else
return 0;
}
int StacksFull(Stacks S) //判斷棧是否滿
{
if (S->top==maxn-1) //棧滿則返回
return 1;
else
return 0;
}
void Pushs(Stacks &S,SNode *e) //進棧操作,因為棧要發生變化,所以棧要用引用型
{
if (!(StacksFull(S))) //進棧之前要判斷棧是否滿,若滿,則不能進棧
{
S->top++; // 先移動棧頂指針,再壓入元素
S->stack[S->top]=*e;
}
else
return ;
}
SNode* Pops(Stacks &S) // 出棧操作,即彈出棧頂元素,用一個節點保存彈出的棧頂元素,作為返回值
{
SNode *e;
if (!(StacksEmpty(S))) // 出棧之前,要判斷棧是否為空,若為空,則無效操作
{
e=&(S->stack[S->top]); // 先挪出元素,再移動棧頂指針
S->top--;
return e;
}
else
return NULL;
}
SNode* GetsTop(Stacks S)
{
if (StacksEmpty(S))
return NULL;
else
return &(S->stack[S->top]);
}
void Free(Stacks &S)
{
free(S);
}
下面給出二叉樹層次遍歷所需要的數據結構:隊列。
二叉樹層次遍歷用到的數據結構:隊列。
typedef struct Node
{
BiNode *data;
struct Node *next;
}LQueNode;
typedef struct
{
LQueNode *front,*rear;
}LinkQueue;
void InitQueue(LinkQueue *&Q)
{
Q=(LinkQueue *)malloc( sizeof (LinkQueue));
Q->front=Q->rear=NULL;
}
int QueueEmpty(LinkQueue *Q)
{
if (Q->front==NULL||Q->rear==NULL)
return 1;
else
return 0;
}
void EnQueue(LinkQueue *&Q,BiNode *e)
{
LQueNode *p;
p=(LQueNode *)malloc( sizeof (LQueNode));
p->data=e;
p->next=NULL;
if (Q->rear==NULL)
Q->front=Q->rear=p;
else
{
Q->rear->next=p;
Q->rear=p;
}
}
BiNode* DeQueue(LinkQueue *&Q)
{
BiNode *e;
LQueNode *p;
if (Q->rear==NULL) //隊空不能出列
return NULL;
else
p=Q->front;
if (Q->front==Q->rear) //隊列中只有一個元素時的出隊操作需特殊處理
Q->front=Q->rear=NULL;
else
Q->front=Q->front->next;
e=p->data;
free(p);
return e;
}
