线性表---栈的简单实现

一.什么是栈

  • 栈是限定仅在表位进行插入和删除操作的线性表
  • 允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。
  • 栈是一种先进后出的线性表(Last IN First Out),简称LIFO结构。
  • 栈的插入操作,叫做进栈,也称压栈,入栈。
  • 栈的删除操作,叫做出栈,也有的叫做弹栈。
    在这里插入图片描述
    在这里插入图片描述

二.栈的基本操作

 1. InitStack(*S):建立一个栈。
 2. DestroyStack(*S):若栈存在,则销毁他。
 3. ClearStack(*S):将栈清空。
 4. StackEmpty(S):若栈为空,返回true,否则返回false。
 5. GetTop(*S,*e):若栈存在且非空,用e返回S的栈顶元素。
 6. Push(*S,e):若栈存在,插入新元素e到栈中并成为新栈顶。
 7. Pop(*S,*e):删除栈S中的栈顶元素,并用e返回其值。
 8. StackLength(*S):返回栈S的元素个数。

三.C语言实现栈的顺序存储结构

#include<bits/stdc++.h>
#define maxsize 100
#typedef int datatype

struct stack
{
	datatype data[maxsize];
	struct stack *next;//栈顶 
 };

typedef struct stack Stack;//创建一个栈
Stack *s; 
 
//初始化一个栈 
void init()
{
	s=Null;
}

//判断栈是否为空 
bool Empty()
{
	if(s==NULL)
		return true;
	else
		return false;
}

//判断栈是否满了 
bool full(Stack *s)
{
	if(s->top==maxsize-1)
		return true;
	else
		return false;	
}

//入栈 
void Push(datatype element)
{
	if(!full())//如果栈没满 
	{
		s.top++;
		s.data[s.top]=element;
	}
}

//出栈 
void Pop()
{
	if(!Empty)//如果栈不为空 
		s.top--;
	else
		printf("栈空");				
}

//获取栈顶元素 
datatype GetTop()
{
	if(!Empty)//如果栈不为空 
		return s.data[s.top]
	else
		printf("栈空");	
}

//获取栈长度 
datatype StackLength()
{
	if(!Empty)//如果栈不为空 
		return s.top+1;
	else
		printf("栈空");		
}

//清空一个栈 
void Clear()
{
	if(!Empty)//如果栈不为空 
		Pop();
	else
		printf("栈空");	
}


//销毁一个栈
void Destroy()
{
	s.top=-1;
 } 
四.C语言实现栈的链式存储结构
#include<stdio.h>
#include<stdlib.h>
struct stack
{
	int element;
	struct stack *next;
};

//创造一个栈
struct stack* CreateStack(void)
{
	struct stack *S=malloc(sizeof(struct stack));
	if(S==NULL)
		printf("error!");
	else
		S->next=NULL;
	return S;		
 }
 
 //判断栈是否为空
 int Empty(struct stack *S)
 {
 	return S->next==NULL;
 }
  
//入栈
void Push(struct stack *S,int e)
{
	struct stack *p;
	p=malloc(sizeof(struct stack));
	if(p==NULL)
		printf("error");
	else
	{
		p->element=e;
		p->next=S->next;
		S->next=p;	
	}	
 } 
 
 //出栈 
 void Pop(struct stack *S)
 {
 	struct stack *p;
 	if(Empty(S))
 		printf("error");
 	else
	{
		p=S->next;
		S->next=p->next;
		free(p);
	}				
 }
 
 //栈顶元素
 int Top(struct stack *S)
{
 	if(Empty(S))
 		printf("error!");
 	else
	 	return S->next->element;	
} 
 
 //清空栈
 void  MakeEmpty(struct stack *S)
 {
 	if(S==NULL)
 		printf("没有栈");
 	else
	 	while(!Empty(S))
		 Pop(S);	
 }
 //销毁栈
 void DistoryStack(struct stack *S)
 {
 	MakeEmpty(S);
 	free(S);
  } 
 
 int main()
 {
   struct stack *S;
   S=CreateStack();
	Push(S,1);
	Push(S,2);
	printf("%d\n",Top(S));
    return 0;
 }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值