栈和队列很早以前就知道有这东西了,兜兜转转也终于走到了这一步,都不难理解,总的来说可以看成//链表头插法和尾插法的变相使用//,但实现起来也有很多要注意的点
一:栈(后进先出,只有一个操作点)
栈的实现:顺序存储结构和链式存储结构
1:顺序栈:使用数组实现
#include<stdio.h> //输出为:0,1,2,3,4,5,6,7,8,9
#include<stdlib.h>//9,8,7,6,5
#define maxsize 100//4
#define True 1
#define False 0
typedef struct
{
int data[maxsize];
int top;
}seqstact;
seqstact *create()//建立一个空栈
{
seqstact *s;
s=(seqstact *)malloc(sizeof(seqstact));
s->top=-1;//栈顶为空
return s;
}
int push(seqstact *s,int e)
{
if(s->top==maxsize-1)//判断是否到达栈顶
{
return False;
}
s->top++;
s->data[s->top]=e;
return True;
}
int pop(seqstact *s,int *e)
{
if(s->top==-1)//判断是否到达栈底
return False;
*e=s->data[s->top];
s->top--;
return True;
}
int gettop(seqstact *s,int *e)//得到此时栈顶元素
{
if(s->top==-1)
{
return False;
}
else
{
*e=s->data[s->top];
return True;
}
}
int main(void)
{
seqstact *s;
int x,y,z,i,result;
s=create();
printf("%d\n",s->top);
for(i=0;i<10;i++)
{
result=push(s,i);
if(result==True) printf("%d ",i);
}
printf("\n");
for(i=0;i<5;i++)
{
x=i;
result=pop(s,&x);
if(result==True) printf("%d ",x);
}
printf("\n");
printf("%d",s->data[s->top]);
}
2:链栈:同链表相似,不同的是,链栈只能操作头节点后的节点,既栈顶。
#include<stdio.h>
#include<stdlib.h>
#define ok 1
#define error 0
typedef struct node//声明栈的数据结构
{
int data;
struct node *next;
}lsnode;
typedef struct
{
lsnode *top;//栈顶
int size;//栈的大小
}lstack;
lstack *create()//创建一个空栈
{
lstack *s;
s=(lstack *)malloc(sizeof(lstack));
s->top=(lsnode *)malloc(sizeof(lsnode));
s->top->next=NULL;
s->size=0;
return s;
}
int push(lstack *s,int e)
{
lsnode *newtop;
newtop=(lsnode *)malloc(sizeof(lsnode));
newtop->data=e;
if(s->size==0)//使用头插法实现栈 ,第一个进栈的需要特殊处理
{
s->top->data=e;
s->size++;
free(newtop);
}
else
{
newtop->next=s->top;
s->top=newtop;
s->size++;
}
return ok;
}
int pop(lstack *s)//栈的输出
{
lsnode *p;
int e;
if(s->size==0)
{
return error;
}
else
{
p=s->top;
e=p->data;
s->top=s->top->next;
free(p);
return e;
}
}
int reach_top(lstack *s)//输出此时的栈顶
{
int e;
e=s->top->data;
return e;
}
int main(void)
{
lstack *s;
int i,result,x;
s=create();
for(i=0;i<10;i++)
{
result=push(s,i);
if(result==ok) printf("%d\t",i);
}
for(i=0;i<5;i++)
{
x=pop(s);
printf("%d\t",x);
}
printf("\n");
x=reach_top(s);
printf("%d\n",x);
}
注:在这里并没有考虑满栈情况,只要malloc还可以申请到空间,就不会出现满栈情况。
二:队列(先进先出,有头尾两个操作方向,首部插入,尾部删除)
1.线性存储(主要采用取余思想)
队空:队尾队头相等
队满:对尾+1==队头
#include<stdio.h>
#include<stdlib.h>
#define True 1
#define False 0
#define MAXSIZE 10
typedef struct
{
int data[10];
int top,end;
}queue;
queue *create()
{
queue *ql;
ql=(queue *)malloc(sizeof(queue));
ql->end=ql->top=MAXSIZE-1;
return ql;
}
int inqueue(queue *ql,int x)
{
if((ql->end+1)%MAXSIZE==ql->top)
return False;
ql->end=(ql->end+1)%MAXSIZE;
ql->data[ql->end]=x;
return True;
}
int empty(queue *ql)
{
if(ql->end==ql->top)
return False;
return True;
}
int quit(queue *ql,int *e)
{
if(empty(ql)){
ql->top=(ql->top+1)%MAXSIZE;
*e=ql->data[ql->top];
return True;
}
return False;
}
int main(void)
{
queue *ql;
ql=create();
int x,y,i,result;
for(i=0;i<12;i++)
{
scanf("%d",&x);
result=inqueue(ql,x);
if(result==1) printf("%d ",x);
}
printf("\n");
for(i=0;i<12;i++)
{
result=quit(ql,&y);
if(result==1) printf("%d ",y);
}
}
2.链队
#include<stdio.h>
#include<stdlib.h>
#define True 1
#define False 0
typedef struct node
{
int data;
struct node *next;
}NODE;
typedef struct
{
NODE *top;
NODE *end;
}queue;
queue *create(){//初始化
queue *p;
p=(queue *)malloc(sizeof(queue));
p->top=p->end=(NODE *)malloc(sizeof(NODE));
p->top->next=NULL;//确定指针指向
return p;
}
int IN(queue *ql,int e)//入队,尾插法
{
NODE *p;
p->data=e;
p->next=NULL;
ql->end->next=p;//和栈不同,这里是尾部移动 ,此外,q->end无初值
ql->end=p;
return True;
}
int empty(queue *ql)//判断是否为空
{
if(ql->end==ql->top)//当队尾和队头指向同一个地址时为空
return True;
return False;
}
int push(queue *ql,int e)//出队
{
NODE *p;
if(!empty(ql)){//有了这一步,就不用 if(ql->top->next==ql->end->next)
return False;
e=ql->top->next->data;
p=ql->top->next;
ql->top->next=p->next;
free(p);
return True;
}
else
return False;
}
int main(void)
{
queue *ql;
ql=create();
int x,y,i,result;
for(i=0;i<5;i++)
{
scanf("%d",&x);
result=IN(ql,x);
if(result==1)
printf("%d ",x);
}
printf("\n");
for(i=0;i<5;i++)
{
result=push(ql,y);
if(result) printf("%d",y);
}
}