数据结构-顺序栈的基本操作的实现(含全部代码)

2023-10-31

主要操作函数如下:

  •     InitStack(SqStack &s) 参数:顺序栈s 功能:初始化  时间复杂度O(1)
  •     Push(SqStack &s,SElemType e) 参数:顺序栈s,元素e 功能:将e入栈 时间复杂度:O(1)
  •     Pop(SqStack &s,SElemType &e) 参数:顺序栈s,元素e 功能:出栈,e接收出栈元素值 时间复杂度O(1)
  •     GetTop(SqStack s,SElemType &e) 参数:顺序栈s,元素e 功能:得到栈顶元素 时间复杂度O(1)
  •     注意:严蔚敏版没有判断栈空函数,在入栈、出栈函数里面判断栈是否空,与王道的不同 尤其是top指针在base之上(有元素时)另外,严蔚敏版 59页取栈顶有误
    /*
        Project: sequence_stack (数据结构-顺序栈)
        Date:    2018/09/14
        Author:  Frank Yu
    	InitStack(SqStack &s) 参数:顺序栈s 功能:初始化  时间复杂度O(1)
    	Push(SqStack &s,SElemType e) 参数:顺序栈s,元素e 功能:将e入栈 时间复杂度:O(1)
    	Pop(SqStack &s,SElemType &e) 参数:顺序栈s,元素e 功能:出栈,e接收出栈元素值 时间复杂度O(1)
    	GetTop(SqStack s,SElemType &e) 参数:顺序栈s,元素e 功能:得到栈顶元素 时间复杂度O(1)
    	注意:严蔚敏版没有判断栈空函数,在入栈、出栈函数里面判断栈是否空,与王道的不同 尤其是top指针在base之上(有元素时)
    	      另外,严蔚敏版 59页取栈顶有误
    	
    */
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    using namespace std;
    #define Status int
    #define SElemType int
    #define MaxSize 100
    //栈数据结构
    typedef struct Stack
    {
    	SElemType *base;//栈底指针 不变
    	SElemType *top;//栈顶指针 一直在栈顶元素上一个位置
    	int stacksize;//栈可用的最大容量
    }SqStack;
    //**************************************基本操作函数************************************//
    //初始化函数
    Status InitStack(SqStack &s)
    {
    	s.base=new SElemType[MaxSize];//动态分配最大容量
    	if(!s.base)
    	{
    		printf("分配失败\n");
    		return 0;
    	}
    	s.top=s.base;//栈顶指针与栈底相同 王道上top起初在base下面,感觉很别扭,top应该高于或等于base
    	s.stacksize=MaxSize;
    	return 1;
    }
    //入栈
    Status Push(SqStack &s,SElemType e)
    {
    	if(s.top-s.base==s.stacksize) return 0;//栈满
    	*(s.top++)=e;//先入栈,栈顶指针再上移 注意与王道上的不同,具体问题具体分析
    	return 1;	
    }
    //出栈 用e返回值
    Status Pop(SqStack &s,SElemType &e)
    {
    	if(s.top==s.base) return 0;//栈空
    	e=*--s.top;//先减减 指向栈顶元素,再给e
    	return 1;	
    }
    //得到栈顶元素,不修改指针
    bool GetTop(SqStack s,SElemType &e) //严蔚敏版59页有问题,应该用e去获得,函数返回bool类型去判断
    {
    	if(s.top==s.base) return false;//栈空			
    	else e=*--s.top;
    	return true;
    		
    }
    //********************************功能实现函数**************************************//
    //菜单
    void menu()
    {
       printf("********1.入栈      2.出栈*********\n");
       printf("********3.取栈顶    4.退出*********\n");
    }
    //入栈功能函数 调用Push函数
    void PushToStack(SqStack &s)
    {
    	int n;SElemType e;int flag;
    	printf("请输入入栈元素个数(>=1):\n");
    	scanf("%d",&n);
    	for(int i=0;i<n;i++)
    	{
    	 printf("请输入第%d个元素的值:",i+1);
    	 scanf("%d",&e);
    	 flag=Push(s,e);
    	 if(flag)printf("%d已入栈\n",e);
    	 else {printf("栈已满!!!\n");break;}
    	}
    }
    //出栈功能函数 调用Pop函数
    void PopFromStack(SqStack &s)
    {
    	int n;SElemType e;int flag;
    	printf("请输入出栈元素个数(>=1):\n");
    	scanf("%d",&n);
    	for(int i=0;i<n;i++)
    	{
    	 flag=Pop(s,e);
    	 if(flag)printf("%d已出栈\n",e);
    	 else {printf("栈已空!!!\n");break;}
    	}
    }
    //取栈顶功能函数 调用GetTop
    void GetTopOfStack(SqStack &s)
    {
    	SElemType e;bool flag; 
    	flag=GetTop(s,e);
    	if(flag)printf("栈顶元素为:%d\n",e);
    	else printf("栈已空!!!\n");
    }
    //主函数
    int main()
    {
     SqStack s;int choice;
     InitStack(s);
     while(1)
     {
      menu();
      printf("请输入菜单序号:\n");
      scanf("%d",&choice);
      if(choice==4) break;
      switch(choice)
      {
      case 1:PushToStack(s);break;
      case 2:PopFromStack(s);break;
      case 3:GetTopOfStack(s);break;
      default:printf("输入错误!!!\n");
      }
     }
     return 0;
    }
    
    基本操作结果截图

    ----------------------------------------回复lena512.bmp(20200427)------------------------------------

回复lena512.bmp

 从图中可以看到地址及地址内存的数据。

------------------------------------------取栈顶的统一回复(20200920)-------------------------------------

传参有多种,可分为参数修改后对原变量进行修改和不修改。对于需要修改的,我们可以使用&或指针,对参数的修改会反应到原来的变量;对于不需要修改的,你可以继续使用&或指针,不做修改那很好,做了修改但是没有回溯(即忘记再反操作回原来的数值)那就不好了,为了防止自己忘记回溯,博主对于get、print等获取数据而不修改的函数使用传值方式,你可以去查看下方专栏的图相关内容,对于图的建立,传参是&G,而遍历则是G。

建议您先复制代码运行一下,没有问题再思考原理,出了问题再评论,好记性不如烂笔头,动手才是王道!

本人b站账号:lady_killer9

更多数据结构实现:数据结构严蔚敏版的实现(含全部代码)

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构-顺序栈的基本操作的实现(含全部代码) 的相关文章

  • JavaScript中的设计原则

    文章目录 一 单一职责原则 1 运用了单一职责 SRP 的设计模式 2 何时应该分离职责 3 优缺点 二 最少知识原则 1 运用了最少知识原则的设计模式 三 开放 封闭原则 1 运用了开放 封闭原则的设计模式 2 接受第一次愚弄 三 接口和
  • 1010 Radix (25 分)

    题目 题目链接 题解 二分 数学 先说几点注意事项 开 LL 最高进制不是35 可以更高 枚举可能的进制时存在爆LL的情况 整体思路 先计算出知道进制的那个数对应的十进制数 二分进制 找到某个进制使得另一个数对应的十进制数与已知的十进制数相
  • 异步信号的去抖电路及同步电路

    异步输入的问题 如果电路有异步信号 就可能使电路进入亚稳态 因为异步信号可能处于时钟信号建立时间以内 即是输出不确定的状态 去抖电路 异步信号如果是外部的机械输入 比如键盘等 输入信号就会产生机械性地振荡 因此首先需要对此类异步信号加一个去
  • 计算机网络-网络层

    网络层 1 前言 2 网络层的作用 3 网络层数据交换 4 网络层协议及报文格式 5 ARP与RARP 6 国际控制报文协议ICMP 1 前言 网络层介于传输层和数据链路层之间 其主要作用是实现两个网络系统之间的数据透明传送 具体包括路由选

随机推荐