一、栈
(1)顺序栈
#include<iostream>
#include<malloc.h>
#define stack_int_size 100
#define stackincrement 10
#define error 0
#define ok 1
using namespace std;
typedef struct{
int *base;
int *top;
int stacksize;
}SqStack;
int InitStack(SqStack &S){ /// 建立
S.base=new int[stack_int_size];
if(!S.base) exit(error);
S.top=S.base;
S.stacksize=stack_int_size;
return ok;
}
int Push(SqStack &S,int e){
if(S.top-S.base>=S.stacksize){
S.base=(int *)realloc(S.base,(S.stacksize+stackincrement)*sizeof(int));
if(!S.base) exit(error);
S.top=S.base+S.stacksize;
S.stacksize+=stackincrement;
}
*S.top++=e;
return ok;
}
int GetTop(SqStack S,int &e){ /// 得到栈顶
if(S.top==S.base) return error;
e=*(S.top-1);
return ok;
}
int Pop(SqStack &S,int &e){
if(S.top==S.base) return error;
e=*--S.top;
return ok;
}
int main(){
SqStack S; /// 顺序栈 S
InitStack(S);
Push(S,1);
int e;
GetTop(S,e);
cout<<e<<endl;
Pop(S,e);
cout<<e<<endl;
return 0;
}
(2)链栈
书上说易于实现 啊啊啊,懒得写
(3)链队列
#include<iostream>
#include<malloc.h>
#define error 0
#define ok 1
using namespace std;
typedef struct QNode{
int data;
QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
int InitQueue(LinkQueue &Q){
Q.front=Q.rear=new QNode;
if(!Q.front) exit(error);
Q.front->next=NULL;
return ok;
}
int EnQueue(LinkQueue &Q,int e){
QNode *p=new QNode;
if(!p) exit(error);
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
return ok;
}
int DeQueue(LinkQueue &Q,int &e){
if(Q.front==Q.rear) return error;
QNode *p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
free(p);
return ok;
}
int main(){
LinkQueue Q; /// 链队列 Q
InitQueue(Q);
EnQueue(Q,1);
int e;
DeQueue(Q,e);
cout<<e<<endl;
return 0;
}
(4)循环队列(顺序队列)
#include<iostream>
#include<malloc.h>
#define error 0
#define ok 1
#define maxqsize 100
using namespace std;
typedef struct{
int *base;
int front;
int rear;
}SqQueue;
int InitQueue(SqQueue &Q){
Q.base=new int[maxqsize];
if(!Q.base) exit(error);
Q.front=Q.rear=0;
return ok;
}
int QueueLength(SqQueue Q){
return (Q.rear-Q.front+maxqsize)%maxqsize;
}
int EnQueue(SqQueue &Q,int e){
if((Q.rear+1)%maxqsize==Q.front) return error;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%maxqsize;
return ok;
}
int DeQueue(SqQueue &Q,int &e){
if(Q.front==Q.rear) return error;
e=Q.base[Q.front];
Q.front=(Q.front+1)%maxqsize;
return ok;
}
int main(){
SqQueue Q; /// 循环队列 Q
InitQueue(Q);
EnQueue(Q,1);
cout<<QueueLength(Q)<<endl;
int e;
DeQueue(Q,e);
cout<<e<<endl;
return 0;
}