一、隊列
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;
}