当前位置: 首页 > news >正文

顺序栈简记

#include<cstdio>
//#define maxlen 1000
//#define elemtype int 
//#define ERROR -1e8

//typedef struct Stack {
//	int top;//记录栈顶位置
//	elemtype elem[maxlen];//保存栈元素
//}SqStack;
typedef struct Stack {
	int top, elem[1000];
}SqStack;
//栈的初始化
void StackInit(SqStack* s) {
	s->top = -1;
}
//判断栈是否为空
int IsStackEmpty(SqStack* s) {
	if (s->top == -1)return 1;
	else return 0;
}
//取栈顶元素
int GetTop(SqStack* s) {
	if (s->top == -1)return -1e8;
	else return s->elem[s->top];
}
//进栈
void Push(SqStack* s, int e) {
	if (s->top == 999)printf("FULL");
	else {
		s->top++;
		s->elem[s->top] = e;
	}
}
//出栈
int Pop(SqStack* s) {
	if (s->top == -1) return -1e8;
	else return s->elem[s->top--];
}

1. 为什么初始化栈顶指针 top 要用 -1,可以用其他的数吗?

top 用来标记栈顶元素的位置。把 top 初始化为 -1 意味着栈为空,因为数组的下标从 0 开始,-1 表明此时栈中没有任何元素。当有元素入栈时,top 会加 1 指向新的栈顶元素。

也可以用其他数来初始化 top,不过要相应地调整入栈和出栈的逻辑。例如,若把 top 初始化为 0,那么入栈时就不需要先对 top 加 1,出栈时也不需要先减 1。但,这样做会让代码逻辑变得复杂,而且 -1 是表示空栈的一种标准做法。

2. 为什么出栈和取栈顶元素时返回 -1e8,可以是其他的数吗?

在出栈和取栈顶元素的操作中,当栈为空时,代码返回 -1e8 来表示操作失败。这里的 -1e8 是一个比较特殊的值,一般情况下栈中的元素不会是这个值,所以可以用它来作为错误标志。

可以使用其他数来替代 -1e8,只要这个数不会作为正常的栈元素出现就行。例如,可以用一个不会出现的特殊值,或使用一个枚举类型来表示错误状态。

3. 栈和数组有什么区别,不是还要靠数组来模拟栈吗,然后自己写一些条件来模仿栈的功能?

栈和数组是不同的数据结构,它们的区别:

  • 概念层面
    • 数组:是一种线性数据结构,用于存储一组相同类型的元素。它可以通过下标随机访问任意位置的元素。
    • :是一种特殊的线性数据结构,遵循后进先出(LIFO)的原则。只能在栈顶进行插入(入栈)和删除(出栈)操作。
  • 操作层面
    • 数组:支持随机访问,可以在任意位置插入和删除元素,但插入和删除操作可能需要移动大量元素,时间复杂度较高。
    • :只支持在栈顶进行插入和删除操作,时间复杂度为 O (1)。

虽然可以用数组来模拟栈的功能,但这并不意味着栈和数组是一样的。使用数组模拟栈是为了在没有内置栈数据结构的情况下实现栈的功能,通过添加一些条件来限制对数组的访问,使其符合栈的特性。

枚举类型来列举错误

#include <cstdio>
#define maxlen 1000
#define elemtype int 

// 定义错误状态
typedef enum {
    SUCCESS = 0,
    ERROR = -1
} Status;

typedef struct Stack {
    int top;
    elemtype elem[maxlen];
} SqStack;

// 栈的初始化
void StackInit(SqStack* s) {
    s->top = -1;
}

// 判断栈是否为空
int IsStackEmpty(SqStack* s) {
    return s->top == -1;
}

// 取栈顶元素
Status GetTop(SqStack* s, elemtype* e) {
    if (IsStackEmpty(s)) {
        return ERROR;
    }
    *e = s->elem[s->top];
    return SUCCESS;
}

// 进栈
void Push(SqStack* s, elemtype e) {
    if (s->top == maxlen - 1) {
        printf("FULL\n");
    } else {
        s->top++;
        s->elem[s->top] = e;
    }
}

// 出栈
Status Pop(SqStack* s, elemtype* e) {
    if (IsStackEmpty(s)) {
        return ERROR;
    }
    *e = s->elem[s->top--];
    return SUCCESS;
}

相关文章:

  • 为什么选择Redis?解析核心使用场景与性能优化技巧
  • QML面试笔记--UI设计篇02布局控件
  • 山东大学计算机网络第五章习题解析
  • 虚拟表、TDgpt、JDBC 异步写入…TDengine 3.3.6.0 版本 8 大升级亮点
  • 数字电子技术基础(四十)——使用Digital软件和Multisim软件模拟显示译码器
  • PyTorch 生态迎来新成员:SGLang 高效推理引擎解析
  • JMeterPlugins-Standard-1.4.0 插件详解:安装、功能与使用指南
  • “拈彩”测试报告
  • 【力扣刷题实战】全排列II
  • JavaScript惰性加载优化实例
  • day22 学习笔记
  • 算法卷一:起行
  • 深入剖析C语言中的指针与数组
  • const let var 在react jsx中的使用方法 。
  • 蓝桥杯真题—路径之谜
  • 一文掌握 google浏览器插件爬虫 的制作
  • springboot-4S店车辆管理系统
  • 2024年博客之星的省域空间分布展示-以全网Top300为例
  • C++设计模式优化实战:提升项目性能与效率
  • 计算机软考中级 知识点记忆 — 编译型与解释型语言对比(Java、C、C++、Python)个人笔记
  • 开发区网站建设工作职责/网站建设 网站制作
  • 网站首页结构/数据分析师培训
  • 政府网站开发的建议/模板自助建站
  • 网站建设设计咨询/百度识图在线
  • 杭州营销型网站建设/seo资讯
  • bootstrap设计的精美网站/百度app