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

一.什么是栈

  • 栈是限定仅在表位进行插入和删除操作的线性表
  • 允许插入和删除的一端称为栈顶(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、付费专栏及课程。

余额充值