学习随记三——顺序栈和链栈的定义和基本运算

本文详细介绍了顺序栈和链栈的概念及其区别。顺序栈使用固定大小的数组实现,栈顶通过一个变量指示,而链栈则采用动态链表,存储空间不连续。文章提供了两种栈的基本操作实现,包括初始化、判断栈空/满、进栈、退栈和获取栈顶元素。顺序栈的实现涉及栈满判断,链栈的实现则包含动态内存分配和释放。
摘要由CSDN通过智能技术生成

顺序栈和链栈的定义和基本运算

  1. 顺序栈和链栈的区别
    (1)、顺序栈是事先确定好大小的,链栈是动态的,它们的区别类似于数组和链表
    (2)、存储空间不同,顺序栈是一块连续的存储空间,链栈是不连续的存储空间,也类似于数组和链表
    顺序栈和链栈更像是运算受限制的数组和链表

  2. 顺序栈的定义和基本运算

#include<stdio.h>
const int StackSize=100;	//确定栈的大小
typedef struct Stack{
	int data[StackSize];		//数据域 
	int top;		//指示栈顶位置 
}Stack;
//顺序栈的基本运算
//置栈空,判栈空,判栈满,进栈,退栈,取栈顶元素 
void InitStack(Stack*s){		//置栈空 
	s->top=-1;
} 
int StackEmpty(Stack*s){		//判栈空
	return s->top==-1; 
}
int StackFull(Stack*s){			//判栈满
	return s->top==StackSize-1;
}
int Push(Stack*s,int x){				//进栈
	if(StackFull(s)){
		printf("The stack is overflow\n");
		return 0;
	} else{
		s->data[++s->top]=x;	//s->top先自加然后存入变量x
	}
	return 1;	//返回1代表函数正常调用
}
int Pop(Stack*s){				//退栈 
	if(StackEmpty(s)){
		printf("The stack is empty\n");
		return 0;
	}else
	return s->data[s->top--];	//返回data[s->top]然后s->top减一
}
int StackTop(Stack*s){			//取栈顶元素
	if(StackEmpty(s)){
		printf("The stack is empty\n");
		return 0;
	} else
	return s->data[s->top];
}
int main(void){
}
  1. 链栈的定义和基本运算
#include<stdio.h>
#include<stdlib.h>
typedef struct StackNode{
	int data;		//数据域
	struct StackNode *next;		//指针域
}Stack;
typedef struct LinkStack{	//再命名一个结构体是为了方便使用栈顶指针,可以在这个结构体中加一个计数变量来记录位置
	struct StackNode* top;	//栈顶指针
}LinkStack;
void InitStack(LinkStack*s){		//置栈空
	s->top=NULL;
}
int StackEmpty(LinkStack*s){		//判栈空
	return s->top==NULL; 
}
int Push(LinkStack*s,int x){			//进栈
	 Stack *p=(Stack*)malloc(sizeof(Stack));
	 p->data=x;
	 p->next=s->top;
	 s->top=p;
}
int Pop(LinkStack*s){				//退栈
	if(StackEmpty(s)){
		printf("Stack underflow\n");
		return 0;
	} 
	Stack*p=s->top;		//保存栈顶指针的地址
	int x=p->data;		//保存data中的数据
	s->top=p->next;		//删除栈顶
	free(p);			//释放不需要的结点
	return x;			//返沪栈顶数据
}
int StackTop(LinkStack*s){			//取栈顶元素
	if(StackEmpty(s)){
		printf("the stack is empty\n");
		return 0;
	} 
	return s->top->data;
}
int main(void){
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值