码迷,mamicode.com
首页 > 其他好文 > 详细

顺序栈

时间:2017-11-26 14:03:55      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:动态内存   ini   names   color   over   can   error   main   存储空间   

/***************************************************************
Author        :h-j-w
Created Time  :2017-11-26
File Name     :顺序栈
**************************************************************/

#include<bits/stdc++.h>
#define STACK_INIT_SIZE 100 ///存储空间初始分配量
#define STACKINCREMENT 10   ///存储空间分配增量
#define OK 1
#define ERROR 0
#define OVERFLOW 1
using namespace std;

typedef int SElemType;
typedef int Status;

typedef struct
{
    SElemType *base;//在栈构造之前和销毁之后,base的值为NULL
    SElemType *top; //栈顶指针
    int stacksize;//当前已分配的存储空间,以元素为单位
}SqStack;
/**************************************************************/
//构建一个空栈
Status InitStack(SqStack &S)
{
    S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!S.base)
        exit(OVERFLOW);
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}
/**************************************************************/
//判断栈是否为空
Status StackEmpty(SqStack S)
{
    if(S.base==S.top)
        return true;
    else
        return false;
}
/**************************************************************/
//求栈的长度
int StackLength(SqStack S)
{
    if(S.top==S.base)
        return ERROR;
    return S.top-S.base;
}
/**************************************************************/
//取栈顶元素,若栈不空用e返回其值,否则返回false
int GetTop(SqStack S)
{
    if(S.top==S.base)
        return false;
    else
        return *(S.top-1);
}
/**************************************************************/
//插入e作为新的栈顶元素
Status Push(SqStack &S,SElemType e)
{
    if((S.top-S.base)>=S.stacksize)///栈满,再开一段存储空间
    {
        S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
                        ///realloc()函数,实现动态内存调整
        if(!S.base)
            exit(OVERFLOW);
        S.top=S.base+S.stacksize;
        S.stacksize+=STACKINCREMENT;
    }
    *S.top=e;
    S.top++;
    return OK;
}
/**************************************************************/
//删除栈顶元素
Status Pop(SqStack &S, int &e)
{
    if(S.top==S.base)
            return ERROR;
    else
    {
        e=*(S.top-1);
        S.top--;
        return OK;
    }
}
/**************************************************************/
//清空栈
Status ClearStack(SqStack &S)
{
    int e;
    while(!StackEmpty(S))///若栈不空StackEmpty(S)返回false,取非(!),则pop()
    {
        Pop(S,e);
    }
    return OK;
}
/**************************************************************/
//销毁栈
Status DestroyStack(SqStack &S)
{
    ClearStack(S);
    free(S.base);
    S.top=NULL;
    S.base=NULL;
    return OK;
}
/**************************************************************/
//从栈底遍历到栈顶元素
bool visit(SElemType a)
{
    printf("%d",a);
    return true;
}

Status StackTraverse(SqStack S,bool(*visit)(SElemType))
{
    if(S.top==S.base)
        return ERROR;
    SElemType *p;
    p=S.base;
    while(p<S.top)
    {
        (*visit)(*p);

        if(p!=S.top-1)
            printf("<---");
        else
            printf("\n");
        p++;
    }
    return OK;
}
/**************************************************************/

int main()
{
    int n;
    SqStack S;
    InitStack(S);
    printf("请输入入栈元素(以0为结束标志):");
    while(~scanf("%d",&n))
    {
        if(n == 0)
            break;
        Push(S,n);
    }
    printf("----------------------------\n");
    printf("栈的长度为:%d\n",StackLength(S));
    printf("----------------------------\n");
    printf("栈内的元素:\n");
    StackTraverse(S,visit);
    printf("----------------------------\n");
    int e;
    Pop(S,e);
    printf("删除的栈顶元素为:%d\n",e);
    printf("栈的长度为:%d\n",StackLength(S));
    printf("栈内的元素:\n");
    StackTraverse(S,visit);
    printf("----------------------------\n");
    int d=GetTop(S);
    printf("栈顶元素为:%d\n",d);
    printf("----------------------------\n");
    printf("ClearStack后");
    ClearStack(S);
    printf("栈的长度为:%d\n",StackLength(S));
    if(StackEmpty(S))
    {
        printf("Empty stack...\n");
    }
    printf("----------------------------\n");
    return 0;
}
/*
1 2 3 4 5 0
*/

 

顺序栈

标签:动态内存   ini   names   color   over   can   error   main   存储空间   

原文地址:http://www.cnblogs.com/hhkobeww/p/7898617.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!