栈是一种特殊的线性表,特殊性在于它的操作受限,栈限定在表尾进行插入和删除,其中表尾称为栈顶,表头称为栈底。学习栈这种特殊结构主要是要学会它的主要操作,包括:创建一个空栈,判空,入栈(插入栈顶元素),出栈(删除栈顶元素)。其中实现栈的基本操作可以通过顺序表和链表的方式。
栈的主要特点:后进先出
图解:
在这里插入图片描述

栈的抽象数据类型

顺序表:

SeqStack SetNullStack_Seq(int m)  创建一个空栈
int IsNullStack_Seq(Stack stack)  判断stack是否为空
void Push_Seq(Stack stack,DataType x)  向栈stack中插入元素x
DataType Pop_Seq(Stack stack)   从栈stack中去出栈顶元素并删除

链表:

LinkStack SetNullStack_Link(int IsNullStack_Link(LinkStack top)  
void Push_Link(LinkStack top,DataType x) 
DataType Pop_Link(LinkStack top)  

顺序表实现栈

顺序栈类型表示

typedef int DataType;
struct Stack
{
	int Max;//最大容量
	int top;//栈顶指针
	DataType*elem;//存放元素的起始指针
};
typedef struct Stack*SeqStack;

创建一个空栈
在这里插入图片描述

SeqStack SetNullStack_Seq(int m)
{
	SeqStack s = (SeqStack)malloc(sizeof(struct Stack));
	if(s!=NULL)
	{
		s->elem = (DataType*)malloc(sizeof(DataType)*m);
		if(s->elem!=NULL)
		{
			s->top = 0;//或者s->top = -1
			s->Max = m;
			return s;
		}
		else
		{
			free(s);
			return NULL;
		}
	}
	else
	{
		printf("Alloc failure!\n");
		return NULL;
	}
}

判断stack是否为空

int IsNullStack_Link(Stack stack)
{
	if(stack->top = 0)//或者stack->top = -1;
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

向栈stack中插入元素x

void Push_Seq(Stack stack,DataType x) 
{
	if(s->top>s->Max-1)//说明栈以满
	{
		printf("overflow,cannot insert");
	}
	else
	{
		s->elem[s->top] = x;
		s->top++;//当top起始位置为0时的情况
	}
}/*当top起始位置为-1时
void Push_Seq(Stack stack,DataType x) 
{
	if(s->top>=s->Max-1)//说明栈以满
	{
		printf("overflow,cannot insert");
	}
	else
	{
		s->top++;
		s->elem[s->top] = x;
	}

从栈stack中去出栈顶元素并删除
在这里插入图片描述

DataType Pop_Seq(Stack stack)
{
DataType index;
	if(stack->top==0)
	{
		printf("not exit!\n");
		return -1;
	}
	else
	{
		index = stack->elem[s->top];
		stack->top--;
		return index;
	}
}

链表实现栈

链栈类型表示

typedef int DataType;
struct Node
{
	DataType data;
	struct Node*next;
};
typedef struct Node*PNode;
typedef struct Node*top,*LinkStack;

创建一个空栈
在这里插入图片描述

LinkStack SetNullStack_Link({
	LinkStack top = (LinkStack)malloc(sizeof(struct Node));
	if(top!=NULL)
	{
		top->next = NULL;
		return top;
	}
	else
	{
		printf("Alloc failure!\n");
		return NULL;
	}
}

判断stack是否为空

int IsNullStack_Link(LinkStack top)
{
	if(top->next==NULL)
		return 1;
	else
		return 0;
}

向栈stack中插入元素x

void Push_Link(LinkStack top,DataType x)
{
	PNode p;
	p = (PNode)malloc(sizeof()struct Node);
	if(p!=NULL)
	{
		p->data = x;
		p->next = top->next;
		top->next = p;
	}
}

从栈stack中去出栈顶元素并删除

在这里插入图片描述

DataType Pop_Link(LinkStack top)
{
	DataType index;
	if( IsNullStack_Link(top))
		{
			printf("not exit!\n");
			return -1;
		}
	else
		{
			index = top->next->data;
			top->next = top->next->next;
			return index;
		}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值