考研數據結構---棧和隊列

棧和隊列

週五了,不想學習,想出去玩滑板,但是今天的任務還沒有完成啊!!!好氣人!!
在這裏插入圖片描述
感覺越到後邊我的導圖越來越不細緻了。趕進度(此刻微信捂臉的表情)
好了,正題!!!!
在這裏插入圖片描述
(超級喜歡這種淡淡的綠色,哈哈哈哈哈哈)

一.棧

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; 
 } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章