数据结构C语言—顺序栈

一、前言

想必我们高校大学生和一些小白在日常学习以及工作当中都会遇到顺序栈,特别是在学习数据结构和C语言的时候仔细听,但下课还是不懂;不仔细听更是一塌糊涂;下面这些文字及代码就是关于顺序栈简单的算法,过程就只需要输入一些相关信息,方可出现运算结果,详情如下:

二、线性表是什么?

顺序栈是栈的顺序实现。顺序栈是指利用顺序存储结构实现的栈。采用地址连续的存储空间(数组)依次存储栈中数据元素,由于入栈和出栈运算都是在栈顶进行,而栈底位置是固定不变的,可以将栈底位置设置在数组空间的起始处;栈顶位置是随入栈和出栈操作而变化的,故需用一个整型变量top来记录当前栈顶元素在数组中的位置。

【内容来源:百度百科-顺序栈顺序栈_百度百科 (baidu.com)

三、代码段

代码如下: 

#include "stdio.h"
#define  MAXLEN  100             /*顺序栈存储空间的总分配量*/
typedef  int  DataType;          /*定义DataType为int类型*/ 
typedef  struct                  /*顺序栈存储类型*/
{   DataType   data[MAXLEN];     /*存放顺序栈的数组*/
    int  top;                    /*记录栈顶元素位置的变量*/
}SeqStack;

void InitStack(SeqStack *S)//初始化函数
{
	S->top=-1;//初始化的顺序栈为空
}

int EmptyStack(SeqStack *S)//判断栈空函数
{
	if(S->top==-1)//栈为空
	    return 1;
	else
	    return 0;
}

int FullStack(SeqStack *S)//判断栈满函数
{
	if(S->top==MAXLEN-1)//栈为满
	    return 1;
	else
	    return 0;
}

int Push(SeqStack *S,DataType x)//进栈操作函数
{
	if(FullStack(S))//调用FullStack(s),判断栈是否为满
	{
		printf("栈满,不能近栈!");
		return 0;//栈满,不能近栈
	}   
	else
	{
		S->top++;
		S->data[S->top]=x;
	    return 1;
	}
}

int Pop(SeqStack *S,DataType *x)//出栈操作函数
{
	if(EmptyStack(S))//调用判空函数EmptyStack(s),判断栈是否为空
	{
		printf("栈空,取栈顶元素失败!");
		return 0;//栈满,不能出栈
	}   
	else//栈不为空
	{
		*x=S->data[S->top];
		S->top--;
	    return 1;
	}
}

int GetTop(SeqStack *S,DataType *x)//取栈顶元素函数
{
	if(EmptyStack(S))//调用判空函数EmptyStack(s),判断栈是否为空
	{
		printf("栈空,取栈顶元素失败!");
		return 0;//栈满,不能出栈
	}   
	else//栈不为空
	{
		
		*x=S->data[S->top];
	    return 1;
	}
}

void  Menu()                                    
{   /*显示菜单子函数*/
    printf("\n                  顺序栈的各种操作");
    printf("\n==================================================");  
    printf("\n|               1——初始化栈                    |");
    printf("\n|               2——入栈操作                    |");
    printf("\n|               3——出栈操作                    |");
    printf("\n|               4——求栈顶元素                  |");
    printf("\n|               0——返回                        |");
    printf("\n=================================================="); 
    printf("\n请输入菜单号(0-4):");   
}

main()
{
   int i,n,flag;
   SeqStack S;
   DataType x;
   char  ch1,ch2,a; 
   ch1='y';
   while(ch1=='y'||ch1=='Y') 
   {  Menu();
      scanf("%c",&ch2);
      getchar();
      switch(ch2)
      {
         case  '1':          
             InitStack(&S);
             printf("栈的初始化完成!");
             break;
         case  '2':
             printf("请输入要入栈的元素个数:");
             scanf("%d",&n);
             printf("请输入%d个入栈的整数:",n); 
             for(i=0;i<n;i++)
             {   
                 scanf("%d",&x);
                 flag=Push(&S,x);
             }
             if(flag==1)
                printf("入栈成功!");
             break;
         case  '3':
             printf("请输入要出栈的元素个数:");
             scanf("%d",&n);
             printf("出栈的元素为:"); 
             for(i=0;i<n;i++)
             {   
                 flag=Pop(&S,&x);
                 printf("%5d",x);
             }
             if(flag==1)
                 printf("\n出栈成功!");
             else
                 printf("出栈失败!");
             break;
         case  '4':
             if(flag=GetTop(&S,&x))
                 printf("当前的栈顶元素值为:%d",x);
             break;
         case  '0':
             ch1='n';break;
         default:
             printf("输入有误,请输入0-4进行选择!");
      }
      if(ch2!='0')
      {   printf("\n按回车键继续,按任意键返回主菜单!\n");
          a=getchar();
          if(a!='\xA')
          {
             getchar();ch1='n';
          }
      }
   }
}

 四、程序运行结果

1.运行示例

2.首先需要初始化栈

3. 进行入栈操作,输入5个元素

4. 输入完可以实现线性表的相关功能,如求栈顶元素:

 这个要特别说明,因为5是最后放进去的,在最上面。所以它是栈顶;

出栈操作:

五、总结

顺序栈就是进行入栈、出栈,求栈顶元素等功能。这个与循环队伍相类似。

以上为顺序栈的代码、操作步骤,其中代码是我在上学时跟老师所敲的,这是数据结构教材的典型案例

另外这个程序还有很多欠缺,由于能力有限没能实现,请见谅!若有侵犯,请联系删除!

文中若有不妥之处请谅解!有不明白的请在评论区问哦

本程序是我在上学期间跟老师所写,若有不妥,请谅解! 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜鸿阳

谢谢您!感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值