一.栈(后进先出)
1)顺序栈
1.定义(top指向最后一个元素的角标)
#define Max 100
Typedef struct stack{
SElemType *data; //或*data;
int top;
int stackSize;
}sqStack;
2.初始化
int InitSqStack(sqStack *LS,int max){
LS->data=(SElemType*)malloc(max*(SElemType));
if(LS->data==NULL) { printf("申请失败\n"); exit(0); }
LS->top=-1;
LS->stackSize=max;
return 1;
}
3.判断为空
int EmptyStack(sqStack S){
if(S.top==-1) return 1;
else return 0;
}
4.获得栈顶
int GetTopSqStack(sqStack S,SElemType *e){
if(S.top==-1) return 0;
*e=S.data[S.top];
return 1;
}
5.求长度
int lengthsqStack(sqStack S){
if(S.top==-1) return 0;
return S.top+1;
}
6.进栈
int PushsqStack(sqStack *S,SElemType e){
if(S->top+1==S->stackSize) //如果栈满
{printf("栈满,进栈失败\n"); return 0;}
S->data[++S->top]=e;
return 1;
}
7.出栈
int PopsqStack(sqStack *S,SElemType *e){
if(S->top==-1) //如果栈空
{printf("栈空,出栈失败\n"); return 0;}
*e=S->data[S->top--];
return 1;
}
8.遍历
int TravessqStack(sqStack S){
int i=0;
if(S->top==-1) //如果栈空
{printf("栈空,遍历失败\n"); return 0;}
for(i=S.top;i>=0;i--){
printf("%d ",S.data[i].number);}
return 1;
}
2)链栈(不带头结点)
1.定义
typedef struct node{
ElemType data;
struct node *next;
}Node,*LinkStack;
2.初始化
int LinkList(LinkStack *LS){
*LS=NULL;
}
3.判断为空
int EmptyStack(LinkStack S){
if(S==NULL) return 1;
return 0;
}
4.获取栈头
int GetTopLinkStack(LinkStack S,ElemType *e){
if(S==NULL) {printf("栈空\n"); return 0;}
*e=S->data;
return 1;
}
5.求长
int lengthLinkStack(LinkStack S){
int n=0;
LinkStack p=L;
while(p){
n++;
p=p->next;
}
return n;
}
6.进栈
int PushLinkStack(LinkStack *S,ElemType e){
LinkStack p=(LinkStack)malloc(sizeof(Node));
if(p==NULL) return 0;
p->data=e;
p->next=*S;*S=p;
return 1;
}
7.出栈
int PopLinkStack(LinkStack *S,ElemType *e){
LinkStack p=*S;
if(*S==NULL) {printf("栈为空\n"); return 0;}
*e=(*S)->data;
*S=(*S)->next;
free(p);
return 1;
}
8.遍历
int TravesLinkStack(LinkStack S){
LinkStack p=S;
if(S==NULL) {printf("栈空\n"); return 0;}
while(p){
printf("%d ",p->data.number);
p=p->next;}
}
二.队列(先进先出)
1)循环队列、
1.定义
#define Max 100
typedef struct {
ElemType data[Max]; //存储数据
int front; //指向头的位置
int rear; //指向尾的位置
int queuesize; //队列容量
}sqQueue;
2.初始化
int Initsqueue(sqQueue *S){
S->front=S->rear=0;
S->queuesize=Max;
return 1;
}
3.判断为空
int Emptysqueue(sqQueue S){
if(S.front==S.rear) return 1;
return 0;
}
4.求长度
int Lengthsqueue(sqQueue S){
return (S.rear-S.front+S.queuesize)%S.queuesize;
}
5.获得队头
int GetHead(sqQueue S,ElemType *e) {
if(S.front==S.rear) {
printf("队为空\n");
return 0;
}
*e=S.data[S.front];
return 1;
}
6.