栈和队列a

一.栈(后进先出)

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值