手擼隊列&&棧&&鏈表(暫時未完,需更新)

一、隊列 

1、普通的隊列

#include<stdio.h>
 
const int MAXN=1e5+10;
 
struct Queue {				//建一個隊列 
	int front,rear;
	int number[MAXN]; 
};
 
Queue Q;
 
void initQueue(Queue &q) {		//初始隊列 
	q.front=0;
	q.rear=0;
}
 
bool isEmpty(Queue &q) {		//判斷隊列是否爲空 
	return q.rear==q.front;
}
 
bool isFull(Queue &q) {			//判斷隊列是爲滿 
	return q.rear==MAXN;
}
 
bool Push(Queue &q,int dt) {	//添加元素 
	if(isFull(q)) return false;
	q.number[q.rear++]=dt;
	return true;
}
 
bool Pop(Queue &q) {			//刪除元素 
	q.front++;
}
 
int getFront(Queue &q) {		//取隊首元素 
	return q.number[q.front];
}
 
int getRear(Queue &q) {
	return q.number[q.rear-1];	//取隊尾元素 
}
 
int main()
{
	int cnt;
	
	initQueue(Q);
		
	int a=10;				//增加一個元素並輸出 
	Push(Q,a);
	if(!isEmpty(Q)) printf("%d\n",getFront(Q));
	
	a=getFront(Q);			//輸出隊首隊尾元素 
	printf("%d\n",a);
	a=getRear(Q);
	printf("%d\n",a);
		
	if(isEmpty(Q)) printf("Q is empty\n");	//輸出是否爲空 
	else printf("Q isn't empty\n");
	
	if(isFull(Q)) printf("Q is full\n");	//輸出是否爲滿 
	else printf("Q isn't full\n");
	
	if(!isEmpty(Q)) Pop(Q);		//刪除元素後判斷是否爲空 
	if(isEmpty(Q)) printf("Now Q is empty\n");
	else printf("Q still not empty\n");
 
	return 0;
}

2、循環隊列

在寫循環隊列的時候出了一點小問題,將普通隊列和循環隊列判斷隊列是否爲空的條件混爲一談,幸好及時發現。

因爲循環隊列特殊的結構,因而用q.front==q.rear判斷是錯誤的,兩者相等的時候有可能是空也有可能是滿 ,此時設計一個tag標記記錄入隊出隊操作。

入隊操作後將tag=1,出隊後將tag=0,則有isEmpty(Q)&&tag表示隊列爲空,isEmpty(Q)&&!tag表示隊列爲滿。

#include<stdio.h>
 
const int MAXN=10;
 
struct circleQ {
	int front,rear;
	int number[MAXN];
};
 
circleQ Q;
 
void initcircleQ(circleQ &q) {
	q.front=0;
	q.rear=0;
}
 
bool isEmpty(circleQ &q) {
	return q.rear==q.front;
}
 
bool isFull(circleQ &q) {
	return (q.rear+1)%MAXN==q.front;
}
 
void Push(circleQ &q,int dt) {
	q.number[q.rear]=dt;
	q.rear=(q.rear+1)%MAXN;
}
 
void Pop(circleQ &q) {
	q.front=(q.front+1)%MAXN;
} 
 
int getFront(circleQ &q) {
	return q.number[q.front];
}
 
int main()
{
	initcircleQ(Q);
	
	int tag;
	
	for(int i=0;i<5;i++) Push(Q,i),tag=1;
	if(isFull(Q)&&tag) printf("CircleQ is full\n");
	else printf("Circle isn't full\n");
	if(isEmpty(Q)&&!tag) printf("CircleQ is empty\n");
	else printf("CircleQ isn't empty\n");
	while(!(isEmpty(Q)&&!tag)) {
		printf("%d ",getFront(Q));
		Pop(Q),tag=0;
	}
	
	printf("\n");
	
	for(int i=0;i<13;i++) Push(Q,i),tag=0;
	while(!(isEmpty(Q)&&!tag)) {
		printf("%d ",getFront(Q));
		Pop(Q),tag=0;
	}	
	
	return 0;
}

 

二、棧

#include<stdio.h>

const int MAXN=100;
struct Stack {					//建立一個棧 
	int top;
	int number[MAXN];
};

Stack S;

void initStack(Stack &s) {		//初始化棧 
	s.top=0;
}

bool isEmpty(Stack &s) {		//是否爲空 
	return s.top==0;
}

bool isFull(Stack &s) {			//是否爲滿 
	return s.top==MAXN;
}

void Push(Stack &s,int dt) {	//入棧 
	s.number[s.top++]=dt;
}

void Pop(Stack &s) {		//出棧 
	s.top--;
}

int getTop(Stack &s) {		//取頂端元素 
	return s.number[s.top-1];
}

int main()
{
	initStack(S);
	
	for(int i=0;i<5;i++) Push(S,i);		//入棧5個 
	if(isEmpty(S)) printf("Stack is empty\n");
	else printf("Stack isn't empty\n");
	if(isFull(S)) printf("Stack is full\n");
	else printf("Stack isn't full\n");
	
	
	for(int i=0;i<2;i++) Pop(S);	//出棧兩個 
	while(!isEmpty(S)) {
		printf("%d ",getTop(S));
		Pop(S);
	}
	
	return 0;
}

-----例題:將十進制轉換成d進制,用到了棧

#include<cstdio>
#include<iostream>
#include<stack>

using namespace std;

stack<int> s;

int main()
{
	int num,d;
	while(cin>>num>>d) {
		while(num) {
			int r=num%d;
			s.push(r);
			num/=d;
		}
		while(!s.empty()) {
			cout<<s.top();
			s.pop();
		}
		cout<<endl;
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章