【数据结构】栈

1.1定义

栈:只允许在表尾进行删除和插入的操作的线性表

1.2栈的存储结构

1.2.1栈的顺序存储结构
  • 栈的结构定义
  • 出栈和入栈
  • 两栈共用空间**
//栈的顺序存储结构
//栈的结构定义
struct stack
{
	int data[MAXSIZE];
	int top;
}sqstack;
//入栈(顺序存储结构)
/*插入元素e为新的栈顶元素*/
int push(sqstack *s,int e)
{
	if(s->top==MAXSIZE-1)
	return -1;//错误
	s->top++;
	s->data[s->top]=e;
	return 0; 
} 
//出栈
int Pop(sqstack *s, int *e)//因为不return e;所以这里用指针改变变量的值
{
	if(s->top==-1)
	return -1;//错误
	*e=s->data[s->top];
	s->top--; 
}
1.2.2 栈的链式存储结构
//栈的链式存储
typedef struct StackNode
{
	int data;
	struct nodestack *next;
}StackNode,*LinkStackptr;
typedef  struct LinkStack
{
	LinkStackptr top;
	int count;
}LinkStack;
int push(LinkStack *S,int e)
{
	s=(LinkStackptr)malloc(sizeof(LinkStackptr));
	s->data=e;
	s->next=S->top;
	S->top=s;
	s->count++;
	return 0;
}
//删除S的栈顶元素,
int Pop(LinkStack *S,int e) 
{
	LinkStackptr p;
	*e=S->top->data;
	p=S->top;
	S->top=S->top->next;
	free(p);
	s->count--;
}

栈的简单应用

1.栈的链式存储结构
#include<stdio.h>
#include<stdlib.h>
#define maxsize 10
struct stacknode
{
	int data;
	struct stacknode *next;
}; 
struct linkstack
{
	struct stacknode *top;
	int count;
};
void push(struct linkstack *s,int e)
{
	struct stacknode *m=(struct stacknode*)malloc(sizeof(struct stacknode));//为什么不是定义结构体 而是定义结构体指针 
	m->data=e; 
	m->next=s->top;
	s->top=m;
	s->count++; 
}
void pop(struct linkstack *s,int *e)
{
	struct stacknode *p;
	*e=s->top->data;
	p=s->top;
	s->top=s->top->next;
	free(p);
	s->count--; 
}
int main()
{
	struct linkstack s;
	int x;
	int i;
	printf("请输入入栈元素:");
	for(i=0;i<3;i++)
	{
		scanf("%d",&x);
		push(&s,x);
	}
	printf("出栈元素为:"); 
	for(i=0;i<3;i++)
	{
		pop(&s,&x);
		printf("%d ",x);
	}
}
2,栈的顺序存储 结构
#include<stdio.h>
#define maxsize 10
struct stack
{
	int data[maxsize];
	int top;
};
int push(struct stack *s,int e)
{
	if(maxsize-1==s->top)
	{
		return -1;
	}
	s->top++;
	s->data[s->top]=e;
	return 1;
}
int pop(struct stack *s,int *e)
{     
	if(s->top==-1)
	return -1;
	*e=s->data[s->top];
	s->top--;
}
int main()
{
	struct stack s;
	int x;
	int i;
	printf("请输入入栈元素:");
	for(i=0;i<3;i++)
	{
		scanf("%d",&x);
		push(&s,x);
	}
	printf("出栈元素为:"); 
	for(i=0;i<3;i++)
	{
		pop(&s,&x);
		printf("%d ",x);
	}
}

共用栈

//两栈共享空间
typedef stack
{
	int data[MAXSIZE];
	int top1;
	int top2;
}sqstack;
//两栈共享空间的结构插入元素
int push(sqstack *s,int e,int stackname) //stackname表示栈一或栈二 
{
	if(s->top1+1==s->top2)
	return -1;
	if(stackname==1)
	s-data[++s->top1]=e;
	else
	s-data[--s->top2]=e;
	return 0;
}//两栈共享空间结构之弹出元素 
int Pop(sqstack *s,int *e,int stackname)//
{
	if(stackname==1)
	{
		if(s->top==-1)
		return -1;//error
		*e=s->data[s->top1++];
		
	}
	else if(stackname==2)
	{
		if(s->top2==MAXSIZE)
		return -1;
		*e=s->data[s->top2--];
		
	}
	return 0;
}

#include<stdio.h>
#define maxsize 3
#define error -1
#define ok 1
struct sqdoublestack
{
	int data[maxsize];
	int top1;
	int top2;
}Sqdoublestack;
void initstack(struct sqdoublestack *s)
{
	s->top1=-1;
	s->top2=maxsize;
}
int push(struct sqdoublestack *s,int stacknumber,int e)
{
	if(s->top1+1==s->top2)
	return error;
	if(stacknumber==1)
	{
		s->top1++;//0 1 2 
		s->data[s->top1]=e;
	}
	else if(stacknumber==2)
	{
		s->top2--;
		s->data[s->top2]=e;
	}
	return ok;
}
int pop(struct sqdoublestack *s,int stacknumber,int *e)
{
	if(stacknumber==1)
	{
		if(s->top1==-1)
		return error;//栈一为空栈 
		*e=s->data[s->top1];
		s->top1--;
	}
	else if(stacknumber==2)
	{
		if(s->top1==maxsize)
		return error;//栈2空栈
		*e=s->data[s->top2]; 
		s->top2++;
	}
	return ok;
}
int main()
{
	int x;
	struct sqdoublestack s;
	initstack(&s);
	printf("请输入三位入栈的元素:");
	for(int i=0;i<3;i++)
	{
		scanf("%d",&x);
		push(&s,2,x);
	}
	printf("出栈元素:");
	for(int i=0;i<3;i++)
	{
		pop(&s,2,&x);
		printf("%d ", x);
	} 
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值