首页 > 其他分享 >【栈】栈的定义及基本操作

【栈】栈的定义及基本操作

时间:2024-12-15 17:29:59浏览次数:8  
标签:SElemType 定义 top 栈顶 栈底 base 基本操作 指针

1. 栈的定义和特点

定义:栈是限定尽在表尾进行插入或删除操作的线性表。

表头元素成为栈底,表尾元素成为栈顶。 

特点:后进先出(先进后出)

2. 顺序栈       

顺序栈是利用顺序存储结构实现的栈,即用一组连续的存储单元依次存储自栈底到栈顶的数据元素。

top 指针指向栈顶元素的指针,base 指针指向栈底元素的指针;

Q.栈不是仅限于栈顶(表尾)进行插入和删除的线性表吗?为何还需要栈底指针?

习惯用 top == 0 表示空栈,鉴于 C/C++语言中数组的下标约定从 0 开始,因此用 C++语言描述是会带来困惑,因此另设指针base 指向栈底元素在顺序表中的位置。

注意点

(1)栈底指针 base,初始化完成之后,始终指向栈底的位置。

         若base == NULL ,则表明栈结构不存在。

(2)栈顶指针 top,其初值为指向栈底。

        栈为空时 top == base,非空时 top 始终指向栈顶元素的上一个位置。

2.1 顺序栈的存储结构

#define MAXSIZE 100
typedef struct{
	SElemType *base;  //利用base 指针指向基地值,即为栈底
	SElemType *top;
	int stackszie; 
}SqStack;

2.2 顺序栈的基本操作

1. 顺序栈的初始化

void InitStack(SqStack &S){
	S.base = new SElemType[MAXSIZE];
	if(!S.base) exit(OVERFLOW);
	S.top = S.base;  //栈顶指针指向base,表示栈空
	S.stacksize = MAXSIZE; 
}

2. 顺序栈的插入

void Push(SqStack &S,SElemType e){
	if(S.top - S.base == S.stacksize){
		cout << "栈已满,无法进行插入操作!" << endl; 
		return;
	}
	*S.top++ = e;
	cout << "成功插入元素!" << endl; 
}

3. 顺序栈的删除

void Pop(SqStack &S,SElemType &e){
	if(S.top == S.base) {
		cout << "栈空,无法进行删除操作!" << endl;
		return;
	}
	e = *--S.top;  //由于栈顶指针始终指向栈顶元素的上一个位置 
	cout << "成功删除元素!" << endl; 
}

4. 顺序栈的取值

SElemType GetTop(SqStack S){
	if(S.base != S.top)
	return *(S.top - 1); 
} 

3. 链栈                                                                                          

链栈是指采用链式存储结构实现的栈。

由于栈的主要操作是在栈顶插入和删除,因此以链表的头部作为栈顶,并且没有必要附加一个头结点。

3.1 链栈的存储结构

typedef struct StackNode{
	SElemType data;
	struct StackNode * next;
}StackNode,*LinkStack;

3.2 链栈的基本操作

1. 链栈的初始化

void InitLinkStack(LinkStack &S){
	S = NULL;    //直接让头指针指向首元结点即可 
	cout << "成功创建链栈!" << endl;
} 

2. 链栈的插入

void Push(LinkStack &S,SElemType e){
	StackNode *p = new StackNode;
	p -> data = e;
	p -> next = S;
	S = p;
	cout << "插入成功!" << endl;
} 

3. 链栈的删除

void Pop(LinkStack &S,SElemType &e){
	if(S == NULL) {
		cout << "栈空,无法进行删除操作" << endl;
		return; 
	}
	StackNode *p = new StackNode;
	p = S;
	S = S -> next;
	e = p -> data;
	delete p; 
}

4. 链栈的取值

SElemType GetTop(LinkStack &S){
	if(S != NULL){
		return S -> data;
	}
}

                                                                                                                           

标签:SElemType,定义,top,栈顶,栈底,base,基本操作,指针
From: https://blog.csdn.net/2301_81182847/article/details/144114707

相关文章

  • 【队列习题】如果允许在循环队列的两端都可以进行插入和删除操作,要求:写出循环队列的类
    题目如果允许在循环队列的两端都可以进行插入和删除操作,要求:写出循环队列的类型定义。分别写出从队尾删除和从队头插入的算法。分析本题实际上是求双端队列的操作约束队头指针指向队头元素的上一个位置队尾指针指向队尾元素1.双端队列的存储结构跟队列的存储结构相......
  • 函数的定义与调用
    一、函数的定义1.基本规则①函数分为main函数(主函数)与其他函数②程序的入口从main函数开始③main函数可以调用其他函数,但其他函数不可以调用main函数2.定义形式返回值类型 函数名(形参){函数体;return返回值;} 注意: ①返回值类型与返回值相同 ②返回值省略......
  • 如何在 PbootCMS 中自定义前台 404 错误页面?
    在PbootCMS中,自定义前台404错误页面非常简单。PbootCMS已经内置支持自定义内容地址错误情况下错误页面的自定义功能。您只需要在站点根目录下定义一个 404.html 文件即可。以下是详细的步骤和注意事项:创建404.html文件:登录到您的FTP客户端或通过服务器管理工具,导......
  • 如何修改网站的错误信息,如何自定义网站的错误页面
    自定义网站的错误页面可以提升用户体验,提供更友好的提示信息。以下是具体步骤:创建错误页面:创建一个新的HTML文件,命名为 404.html、500.html 等,根据需要创建不同的错误页面。在错误页面中,编写友好的提示信息和导航链接,帮助用户返回网站的其他部分。配置Web服务器:对于......
  • spark如何自定义函数
    UDF:一对一的函数【UserDefinedFunctions】substr、split、concat、instr、length、from_unixtimeUDAF:多对一的函数【UserDefinedAggregationFunctions】聚合函数count、sum、max、min、avg、collect_set/listUDTF:一对多的函数【UserDefinedTabularFunctions】ex......
  • 使用任务队列TaskQueue和线程池ThreadPool技术实现自定义定时任务框架详解
    前言在桌面软件开发中,定时任务是一个常见的需求,比如定时清理日志、发送提醒邮件或执行数据备份等操作。在C#中有一个非常著名的定时任务处理库Hangfire,不过在我们深入了解Hangfire之前,我们可以手动开发一个定时任务案例,用以帮助我们理解Hangfire的核心原理。我们可以利用......
  • QT 定义全局变量、通过函数初始化变量
    1.头文件中定义全局变量#ifndefZ3_GVARS_H#defineZ3_GVARS_H#include<QString> classZ3_GVARS{ public: staticQStringJSON_FILE_NAME; staticQStringSERVER_IP; staticintSERVER_PORT; staticvoidinitConfig();};#endif//!Z3_GVARS_H 2.在cpp......
  • 数据库管理系统——SQL(概述与数据定义)
    摘要:在上一个章节数据库管理系统——关系模型之关系运算-CSDN博客中,我们学习了SQL语言的理论支撑——关系运算,本篇博客将讲述SQL(结构化查询语言)如何在关系型数据库中的使用目录一、SQL概述1.1SQL的特点1.2SQL对关系数据库三级模式的支持二、数据定义2.1数据库模式定......
  • cmake 变量定义set 和unset
    cmake变量定义set和unset1.变量定义1.1普通变量定义1.2设置缓存条目2环境变量设置3unset取消设置在cmake中变量有两种:变量(普通、缓存)环境变量1.变量定义1.1普通变量定义set(<variable><value>...[PARENT_SCOPE])在CMAKE中没有定义类型概念,set......
  • 【Julia】自定义函数
    [Julia]006函数映射法pc=x->2*xprintln(pc(21.1))表达式法f(x,y)=x*y#定义乘法函数简化方法println(f(3.,7.))结构法functionf(x,y)#定义乘法函数x*yendprintln(f(3,7))return关键字functionsum(n,k)#多个中间变量时使用if......