基于c语言线性结构—栈和队列

栈定义

栈(Stack)是限定只能在表的一端(表尾)进行插人或刪除操作的线性表。允许进行插人或删除的这一端称为栈顶(Top);另一端则称栈底(Bottom),不能进行插人或删除。

当栈中没有包含数据元素时,称为空栈。栈非空时,处于栈顶位置的元素称为栈顶元素。向一个栈插人新的元素称为人栈或进栈(Push),此时,插人的元素成为新的栈顶元素;从找中删除一个元素时,只能删除当前的栈顶元素,称为出栈或退栈(Pop)。

由于栈的插人和删除只能在栈顶进行,最先人栈的元素必定最后出栈,最后人栈的元素最先出栈,因此栈又叫做后进先出(Last In First Out,LIFO)线性表。

这里写图片描述

顺序表的表示与实现

与顺序表类似,顺序栈就是用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。

实现代码
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define  STACK_INITsize 5
#define  STACK_INCREASE 5

typedef struct {
    int *base;
    int *top;
    int stacksize;//分配存储空间
} sqlstack;

int initStack(sqlstack *p){
     p->base = malloc(sizeof(int)*STACK_INITsize);//开辟了STACK_INITsize
     //个int内存单元,p->base指向第一个内存单元。
     if(p->base==NULL){
        return ERROR;
     }
     p->stacksize = STACK_INITsize;
     p->top = p->base;//设置为空栈
     return OK;


}

int EmptyStack(sqlstack *p){
    if(p->base==p->top){
        printf("栈是空栈\n");
    }else{
        printf("栈不是空栈 \n");
    }
     return OK;
}

int pushStack(sqlstack *p,int value){
    if(p->top-p->base>=p->stacksize){
        p->base = realloc(p->base,(p->stacksize+STACK_INCREASE)*sizeof(int));
        if(p->base==NULL){
            return ERROR;
        }
           p->top = p->base+p->stacksize;
           p->stacksize+=STACK_INCREASE;
    }
      p->top++;//栈顶指针加1, p->top指向的是int的内存单元格,所以每次移动一下,指针地址是加上4.
    *(p->top) = value;

    return OK;

  }


  int popStack(sqlstack *p){
      if(p->top==p->base){
  //空栈
        return ERROR;
      }
      p->top--;
      printf("出栈一个元素 \n");
      return OK;
  }

   int getTop(sqlstack *p){
       if(p->base==p->top){
        return ERROR;
       }
       printf("栈顶的元素: %d \n",*(p->top));
       return OK;
   }

int main()
{
    int choice;
    sqlstack *p = malloc(sizeof(sqlstack));
    int value;
    do{
        printf("1 栈的初始化 \n");
        printf("2 判断栈是否为空 \n");
        printf("3 入栈的操作 \n");
        printf("4 出栈的操作 \n");
        printf("5 取栈顶元素 \n");
        scanf("%d",&choice);
        switch(choice){
        case 1:
            initStack(p);
        break;
        case 2:
            EmptyStack(p);
        break;
        case 3:
            printf("请输入要入栈的值:\n");
            scanf("%d",&value);
            pushStack(p,value);
        break;
        case 4:
            popStack(p);
        break;
        case 5:
            getTop(p);
        break;
        }
    }while(choice>0);

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值