栈的基本操作

实验训练内容(包括实验原理和操作步骤):

编写程序,实现顺序栈的创建、进栈和出栈等基本操作算法。

(1)初始化顺序栈s。

(2)定义进栈操作,依次进栈元素1,3,5,7,9。

(3)取栈顶元素并输出。

(4)定义出栈操作,输出出栈序列。

(5)删除栈中值为给定值的元素。

(6)实现顺序栈s中元素的逆置。

(7)销毁顺序栈。

 

实验总结(包括实验数据分析、实验代码、实验结果、实验过程中出现的问题及解决方法等):

代码如下:

 

#include <stdio.h>

#include<malloc.h>

#define OK 1

#define ERROR 0

#define OVERFLOW -1

#define MAXSIZE 100

typedef int SElemType;//将 整型 int 关键字 重新命名为 SElemtype

typedef int status;

typedef struct{

       SElemType *base;

       SElemType *top;

} SqStack;

//(1)初始化顺序栈

status initstack(SqStack &S){

       S.base=new SElemType[MAXSIZE];

       //为顺序栈动态分配一个最大容量为MAXSIZE的数组空间

       if(!S.base)

         return(OVERFLOW);//存储分配失败

       S.top=S.base;//top初始为base,空栈

       return OK;

}

//(2)进栈

status push(SqStack &S,SElemType e){

       if((S.top-S.base)>=MAXSIZE)

           return ERROR;

       *S.top++=e;//元素e压入栈顶,栈顶指针加1

       return OK;

}

//(3)取栈顶元素并输出

bool GetTop(SqStack S,SElemType &e){

       if(S.top==S.base)

         return false;

         else e=*--S.top;

         printf("栈顶元素为%d\n",e);

         return true;

}

//输出栈的元素,当栈顶不等于栈底时,输出栈底的元素,并对栈底的地址加1。

void output(SqStack S){

       while(S.top!=S.base){

              printf("%d\n",*S.base);

              S.base++;

       }

}

//(4)定义出栈操作,输出出栈序列

status pop(SqStack &S,SElemType &e){

       if(S.top==S.base)

         return 0;

         e=*--S.top;//栈顶指针减1,将栈顶元素赋给e

         printf("出栈的元素为%d\n",e);

         return 1;

}

//(5)删除栈中值为给定值的元素

//先定义一个数组,让栈顶减1 指向最后一个元素

//当最后一个元素不等于要找的元素时,栈顶-1,直到找到为止

//如果当栈顶等于栈底或栈顶等于0时 还没找到,则说明没有这个元素,查找失败。

int deletely(SqStack &S,SElemType e){

       int t,x=0;

       int a[MAXSIZE];

       *(--S.top);

       while (*(S.top)!=e){

              a[x]=*(S.top)--;

              x++;

              if(*(S.top)==0){

                     printf("\n删除失败,栈中没有这个元素\n");

                     return 0;

                      //if(*(S.top)==NULL)

             //printf("\n删除失败");

              }

       }

       printf("\n删除成功");

              for(int i=x-1;i>=0;i--)

                 *S.top++=a[i];

}

//(6)实现顺序栈s中元素的逆置

 //先定义一个数组,让栈顶减1,指向最后一个元素,当栈顶不等于栈底时

  //将元素 放进数组里面 直到将栈底放入最后一个元素 然后 再将数组重新放回栈里。

int Localinversion(SqStack S){

       int a[MAXSIZE];

       int x=0;

       *(--S.top);

       while(S.top!=S.base){

              a[x]=*(S.top)--;

              x++;

       }

       a[x]=*S.top;

       for(int i=0;i<=x;i++){

              *S.top++=a[i];

       }

}

//(7)销毁顺序表

void DestroyStack(SqStack &S)

{

       if(S.base){

              free(S.base);

              //通常与申请内存空间的函数malloc()结合使用

              //可以释放由 malloc()、calloc()、realloc() 等函数申请的内存空间。

              S.base=NULL;

              S.top=NULL;

              /*while(S.top!=S.base){

              free(NULL);

              S.base++;}

              */

       }

}

int main(){

       int e;

       SqStack sq;

       initstack(sq);

       push(sq,1);

       push(sq,3);

       push(sq,5);

       push(sq,7);

       push(sq,9);

       output(sq);

       GetTop(sq,e);

       pop(sq,e);

       printf("删除的元素为5\n");

       deletely(sq,5);

       printf("删除后的栈的元素为\n");

       output(sq);

       Localinversion(sq);

       printf("逆置后栈的元素为\n");

       output(sq);

       DestroyStack(sq);

       return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值