用c 实现顺序栈

 

1.栈的定义与基本操作

     栈(stack)是一种仅允许在一端插入和删除运算的线性表。栈中允许进行插入和删除的一端,称为栈顶(top)。栈顶的第一个元素称为栈顶元素。栈中不可以插入和删除的那一端,称为栈底(bottom)。在一个栈中插入新元素,即把新元素放到当前栈顶元素的上面,使其成为新的栈顶元素,这一操作称为进栈,入栈或压栈(push)。从一个栈中删除一个元素,把栈顶元素删除掉,使其下面的元素成为新的栈顶元素,称为出栈或退栈(pop)。

 注意:插入或删除都只能在栈顶一端进行。由于栈的插入或删除只能在栈顶一端进行,后进本栈的元素必定先出栈,所以栈又称为后进先出的线性表(last in first out)(简称LIFO结构)

 

2.栈的基本操作

  定义在栈上的基本操作有如下几种。

  • 1) InitStack(s):构造出一个空栈S。
  • 2) ClearStack(s):清除栈S中的所有元素。
  • 3) StackEmpty(s):判断栈S是否为空。
  • 4) GetTop(s):返回S的栈顶元素,但不能移动栈顶指针。
  • 5) Push(s,x):插入元素x 为新的栈顶元素。
  • 6) Pop(s) :删除s 的栈顶元素并返回其值。

 由于栈是运算受限制的线性表,因此线性表的存储结构对于栈来说也同样适用。即栈的存储构也难为顺序存储和链式存储,也称为顺序栈和链式栈。

 

3.1.2顺序栈的存储结构和操作的实现

       1.顺序栈的存储存储结构的定义

              顺序栈,即是利用一组连续的存储单元依次存放从栈底到栈顶的数据元素,我们用一个数组描述顺序栈中数据元素的相信区域,并预先设计数组的最大存储空间。用一个整型变量top来指示栈顶的位置,通常称为栈顶指针。因此,顺序栈的存储结构的描述如下:

#define Maxsize 100 /*设顺序表的最大长度为100,可依具体情况分配空间*/

typedef int datatype;

typedef struct

{

       datatype stack[Maxsize];

       int top;/*栈顶指针*/

}SeqStack;//顺序栈类型定义

 

由于c语言中数组的下标从0开始。即s->stack[0]是栈底元素,而栈底指针s->top 是正向增

长的,即进栈是需将s->top加1,退栈时s->top减1 ,因此当S->top=--1(或<0)表示栈空,S->top=Maxsize-1表示栈满。

       2.顺序栈的基本操作

              在进行入栈操作之前,首先判断栈是否已满,在进行出栈之前先判断栈是否为空。

  • (1) 构造一个空栈

//构造一个空栈

SeqStack *InitStack()

{

       SeqStack *s;/* s为顺序栈类型变量的指针*/

       s=(SeqStack *)malloc(sizeof(SeqStack));

       if(!s)

       {

              printf("空间不足/n");

              return NULL;

       }

       else

       {

              s->top=-1;

              return s;

       }

}

 

  • (2) 取栈顶元素

//取栈顶元素

datatype GetTop(SeqStack *s)

{

       if(s->top == -1)

       {

              printf("/n栈是空的!");

              return 0;

       }

       else

              return s->stack[s->top];

 

}

  • (3) 入栈

//入栈

 

SeqStack *Push(SeqStack *s,datatype x)

{

       if(s->top == Maxsize-1 )

       {

              printf("/n栈是满的!");

              return NULL;

       }

       else

       {

              s->top++;

              s->stack[s->top]=x;

              return s;

       }

}

 

  • (4) 出栈

//出栈

datatype Pop(SeqStack *s)

{

       if(s->top == -1)

       {

              printf("/n栈已经空了!");

              return 0;

       }

       s->top--;

       return s->stack[s->top+1];

}

  • (5) 判断空栈

//判别空栈

datatype SeqStackEmpty(SeqStack *s)

{

       if(s->top ==-1)

       {

              printf("此栈是空栈!");

              return 1;

       }

       else

       {

              printf("此栈不是空栈!");

              return 0;

       }

}

 

(6) 循环遍历栈

void display(SeqStack *p)

{

       int t ;

       t = p->top;

       if(p->top==-1)

       {

              printf("/n此栈是空的");

       }

       else

              while(t!=-1)

              {

                     printf("%d->",p->stack[t]);

                     t--;

              }

}

 

 

              (7)main函数来测试上面的各种操作

main()

{

       int arr[8]={1,2,3,4,5,6,7,8},i;

       SeqStack *p;

       p=InitStack();

      

       //入栈

      

       for(i=0;i<8;i++)

       Push(p,arr[i]);

      

       //遍历栈

 

       printf("新栈的元素是: ");

       display(p);

       printf("/n");

      

       //得栈顶元素

       printf("栈顶元素是: ");

       printf("%d",GetTop(p));

       printf("/n");

      

       //判别空栈

       printf("判断是否为空栈?: ");

       SeqStackEmpty(p);

       printf("/n");

      

       //出栈

       printf("出栈元素:");

       printf("%d",Pop(p));

       printf("/n");

 

       //出栈后的栈里元素是:

       printf("出栈后的栈里元素是: ");

       display(p);

       printf("/n");

}

可在以下网址下载源程序

http://lijingronghcit.download.csdn.net/user/lijingronghcit/all/1

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值