非常规方法实现栈的操作

代码:
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

typedef int ElemType; //将int 类型定义为ElemType,ElemType也可以是其它类型char,double等等
typedef struct//之所以非常规就在于结构体里面定义的不是一个数组而是两个指针
{
    ElemType *base;//栈底指针
    ElemType *top;//栈顶指针
    int stackSize;//表示栈容量的大小
}sqStack;
//初始化栈
void initStack(sqStack *s)
{
    s->base=(ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));栈底指针指向所申请的这一片空间的第一个地址
    if(!s->base)
    {
        printf("No Enough Space!\n");
         exit(0);
    }


    s->top =s ->base;//初始化栈顶和栈底相等说明此时栈为空
    s->stackSize = STACK_INIT_SIZE;
}
       
//压栈操作Push
void Push(sqStack *s,ElemType e)
{
    if(s->top-s->base>=s->stackSize)//如果栈顶减去栈底等于栈的容量则表示栈满
    {s->base = (ElemType*)realloc(s->base,(s->stackSize + STACKINCREMENT)*sizeof(ElemType));//扩大栈的容量,realloc像c++里面的拷贝构造函数,可以对比理解 
if(!s->base)
        {
            printf("No Enough Space!\n");
            exit(0);
        }
    }
    *(s->top) = e;
    s->top++;
}
//出栈操作
int Pop(sqStack *s,ElemType *e)
{
    if(s->top == s->base)
        return 0;
    *e = *--(s->top);
    return 1;
}
//计算栈的长度(有几个元素)
int GetStackLength(sqStack *s)
{
   int length=0;
  length=s->top-s->base;
   return length;
}
//栈的销毁
void DestroyStack(sqStack *s)
{
    int i,len ;
    len=s->stackSize;
    for(i=0;i<len;i++)
    {
        free (s->base);//从栈底依次释放每个空间
        s->base++;
    }
    s->base = s->top=NULL;
    s->stackSize=0;
}
//清空栈,清空和销毁不一样清空只是把指针改变(数据还在只是不能访问了,下次进栈将被覆盖)
void ClearStack(sqStack*s)
{
 s->top=s->base;
}


int main()
{
    int i,e,num,length;
    sqStack *s=(sqStack*)malloc(sizeof(sqStack));
    initStack(s);
    printf("请输入需要入栈的数(EOF):");

    while (scanf("%d",&num)!=EOF)//循环输入EOF结束(ctrl+z)
    {
      Push(s,num);
     }
    length=GetStackLength(s);
    printf("栈的长度为:%d\n",length);


    printf("出栈:\n");
    while(length>0)
     {
       Pop(s ,&e);
       printf("%d ",e);
       length--;
      }

     DestroyStack(s);

    return 0;
}


猜你喜欢

转载自blog.csdn.net/u011648373/article/details/79031799
今日推荐