数据结构-栈的动态顺序存储表示-初始化压栈弹栈

2024-04-22 07:32

本文主要是介绍数据结构-栈的动态顺序存储表示-初始化压栈弹栈,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

由于没有设置index参数,所以该code不能随时的输出,然后再继续进行push和pop,因为一次输出栈,就把top压到了bottom,可以通过增加index,进行恢复。还有一点要注意,栈顶top,存储的是垃圾值,因为是top++操作,可以通过++top进行改正。

#include<iostream>
#include<stdlib.h>
#define STACK_SIZE 100
#define STACKINCREMENT 10
#define ERROR 0
#define OK 1
using namespace std;typedef struct sqstack
{int *bottom;int *top;int stacksize;
}SqStack;SqStack *init_stack()
{SqStack *s;s=(SqStack*)malloc(sizeof(SqStack));s->bottom=(int*)malloc(STACK_SIZE*sizeof(int));if(!s->bottom) {return NULL;}s->top=s->bottom;s->stacksize=STACK_SIZE;return s;
}int insert_stack(SqStack *s,int num)
{if(s->top-s->bottom+1>=s->stacksize){int *prt;prt=(int*)realloc(s->bottom,(STACKINCREMENT+s->stacksize)*sizeof(int));if(!prt) return ERROR;s->bottom=prt;s->top=s->bottom+s->stacksize;s->stacksize+=STACKINCREMENT;}*s->top=num;s->top++;return OK;
}int delete_stack(SqStack *s)
{int num;if(s->top==s->bottom) return ERROR;s->top--;num=*s->top;return num;
}void show_stack(SqStack *s)
{SqStack *ns;ns=s;ns->top--;cout<<"自顶向下输出栈"<<endl;while(ns->top!=ns->bottom){cout<<*ns->top<<" ";ns->top--;}cout<<*ns->bottom<<endl;
}int main()
{SqStack *S;if(S=init_stack()){cout<<"初始化成功"<<endl;}else cout<<"初始化失败"<<endl;while(1){int choose;cout<<"插入输入1,删除输入2,输出栈输入3:";cin>>choose;if(choose==1){cout<<"输入插入的数字:";int num;cin>>num;if(insert_stack(S,num)){cout<<"插入成功"<<endl; }else {cout<<"插入失败"<<endl;}}else if(choose==2) {int num;if(num=delete_stack(S)){cout<<"删除的元素为:"<<num<<endl;} else {cout<<"栈顶元素删除失败"<<endl; }}else {show_stack(S);}}return 0;
} 


这篇关于数据结构-栈的动态顺序存储表示-初始化压栈弹栈的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/925154

相关文章

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给