实现顺序栈的初始化、入栈和出栈操作

编写一个程序实现顺序栈的初始化、入栈和出栈操作;

//方案1
# include<stdlib.h>
#include<iostream>
using namespace std;
# define STACK_INIT_SIZE 20
# define stackincrement 20/*不是动态分配存储空间,所以需要定义一个增量*/
typedef int SElemType;
typedef bool Status;
typedef struct
{
    SElemType *base;//栈底指针,栈构造之前和销毁之后,其值为NULL
    SElemType *top;//栈顶指针
    int stacksize;//当前已经分配的存储空间,以元素为单位
}SqStack;
void print(SElemType c)
{
    printf("%d ",c);
}
    //构造一个空栈S
Status InitStack(SqStack &S)
{
    S.base = new SElemType[STACK_INIT_SIZE];
    if(!S.base) cout << "分配内存失败" << endl;

    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return true;
}
    //将元素e插入栈顶
Status Push(SqStack &S,SElemType e)
{
    if (S.top-S.base >= S.stacksize)//栈满,利用realloc增加存储空间每次增加stackincrement个int类型空间
    {
        S.base = (SElemType *)realloc(S.base,((S.stacksize+stackincrement)*sizeof(SElemType)));
        if (!S.base)
        {
            exit (-1);
        }
        S.top = S.base + S.stacksize;
        S.stacksize = S.stacksize + stackincrement;
    }
    *S.top++ = e;
    return true;
}
    //从栈底到栈顶依次对栈中每个元素调用函数visit
void StackTraverse(SqStack S,void (* visit)(SElemType))
{
    while (S.top > S.base)
    {
        visit(*(S.base)++);
    }
    cout << endl;
}
int main(void)
{
    int j;
    SqStack s;
    InitStack(s);
    cout << "初始化后栈s的空间为:" << s.stacksize << endl;
    for (j=1; j<=20; ++j)
    {
        Push(s,j);
    }
    cout << "操作完后,栈s的空间为:" << s.stacksize <<endl;
    cout << "栈中的元素为:" << endl;
    StackTraverse(s,print);
    return 0;
}

//方案2
# include<stdlib.h>
#include<iostream>
using namespace std;
# define STACK_INIT_SIZE 20
# define stackincrement 20/*不是动态分配存储空间,所以需要定义一个增量*/
typedef int SElemType;
typedef struct
{
    SElemType *base;//栈底指针,栈构造之前和销毁之后,其值为NULL
    SElemType *top;//栈顶指针
    int stacksize;//当前已经分配的存储空间,以元素为单位
}SqStack;
void print(SElemType c)
{
    cout << c << " ";
}
    //构造一个空栈S
void InitStack(SqStack * S)
{
    if (! ((* S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType))))//一次分配20个int类型的空间
    {
        exit(-1);
    }
    (* S).top = (* S).base;
    (* S).stacksize = STACK_INIT_SIZE;
}
    //将元素e插入栈顶
void Push(SqStack * S,SElemType e)
{
    if ((* S).top-(* S).base >= (* S).stacksize)//栈满,利用realloc增加存储空间每次增加stackincrement个int类型空间
    {
        (* S).base = (SElemType *)realloc((* S).base,((* S).stacksize+stackincrement)*sizeof(SElemType));
        if (!(* S).base)
        {
            exit (-1);
        }
        (* S).top = (* S).base + (* S).stacksize;
        (* S).stacksize = (* S).stacksize + stackincrement;
    }
    *((* S).top)++ = e;
}
    //从栈底到栈顶依次对栈中每个元素调用函数visit
void StackTraverse(SqStack S,void (* visit)(SElemType))
{
    while (S.top > S.base)
    {
        visit(*(S.base)++);
    }
    cout << endl;
}
int main(void)
{
    int j;
    SqStack s;
    InitStack(&s);
    cout << "初始化后栈s的空间为:" << s.stacksize << endl;
    for (j=1; j<=20; ++j)
    {
        Push(&s,j);
    }
    cout << "操作完后,栈s的空间为:" << s.stacksize <<endl;
    cout << "栈中的元素为:" << endl;
    StackTraverse(s,print);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ancientear/article/details/80190734