棧和隊列
週五了,不想學習,想出去玩滑板,但是今天的任務還沒有完成啊!!!好氣人!!
感覺越到後邊我的導圖越來越不細緻了。趕進度(此刻微信捂臉的表情)
好了,正題!!!!
(超級喜歡這種淡淡的綠色,哈哈哈哈哈哈)
一.棧
1.順序棧的實現
#define MaxSize 50
typedef struct{
Elemtype data[MaxSize];//存放棧中元素
int top;//棧頂指針
};
2.棧的基本運算
//初始化
void InitStack(SqStack &s)
{
S.top=-1;//初始化棧頂指針
}
//判斷空
bool StackEmpty(SqStack s)
{
if(S.top==-1) //棧空
return true;
else
return false;//不空
}
//進棧
bool Push(SqStack &S,ElemType x){
if(S.top==MaxSize-1)//棧滿,報錯
return false;
S.data[++S.top]=x;//指針先加1,再入棧
return true;
}
//出棧
bool Pop(SqStack &S,ElemType &x){
if(S.top==-1) //棧空,報錯
return false;
x=S.data[S.top--];//先出棧,指針再減1
return true;
}
//讀棧頂元素
bool GetTop(SqStack S,ElemType &x){
if(S.top==-1)//棧空,報錯
return false;
x=S.data[S.top];//x記錄棧頂元素
return true;
}
3.棧的鏈式存儲類型
//棧的鏈式存儲類型
typedef struct Linknode{
ElemType data;//數據域
struct Linknode *next;//指針域
}*LiStack;
二.隊列
1.隊列的順序存儲類型
#define MaxSize 50
typedef struct{
ElemType data[MaxSize];//存放隊列元素
int front,rear;//隊頭指針和隊尾指針
}SqQueue;
2.循環隊列的操作
//初始化
void InitQueue(SqQueue &Q)
{
Q.rear=Q.front=0;//初始化隊首,隊尾指針
}
//判隊空
bool isEmpty(SqQueue Q)
{
if(Q.rear==Q.front) return true;//隊空條件
else return true
}
//入隊
bool EnQueue(SqQueue &Q,ElemType x)
{
if((Q.rear+1)%MaxSize==Q.front) return false;//隊滿
Q.data[Q.rear]=x;
Q.rear=(Q.rear+1)%MaxSize; //隊尾指針加1取模
return true;
}
//出隊
bool DeQueue(SqQueue &Q,ElemType &x)
{
if(Q.rear==Q.front) return false;//隊空,報錯
x=Q.data[Q.front];
Q.front=(Q.front+1)%MaxSize;//隊頭指針加1取模
return true;
}
3.隊列的鏈式存儲
//隊列的鏈式存儲
typedef struct{ //鏈式隊列結點
ElemType data;
struct LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front,*rear;//隊列的隊頭和隊尾指針
}LinkQueue;
4.鏈式隊列的基本操作
//鏈式隊列的基本操作
//初始化
void InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));//建立頭結點
Q.front->next=NULL;//初始爲空
}
//判隊空
bool IsEmpty(LinkQueue Q)
{
if(Q.front==Q.rear) return true;
else return false;
}
//入隊
void EnQueue(LinkQueue &Q,ElemType x){
LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=x;s->next=NULL;//創建新結點,插入到鏈尾
Q.rear->next=s;
Q.rear=s;
}
//出隊
bool DeQueue(LinkQueue &Q,ElemType &x)
{
if(Q.front==Q.rear) return false;//空隊
LinkNode *p=Q.front->next;
x=p->data;
Q.front.next=p->next;
if(Q.rear==p)
Q.rear=Q.front;//若原隊列中只有一個結點,刪除後變空
free(p);
return true;
}