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