数据结构----顺序栈

来源:互联网 发布:我家网络连着异界 编辑:程序博客网 时间:2024/06/11 16:33

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<cstdlib>using namespace std;#define LL long long#define M(a,b) memset(a,b,sizeof(a))typedef struct{    int *base;///栈底    int *top;///栈顶    int stacksize;} Sqstack;int Initsatck( Sqstack &S) ///建立空栈{    S.base = (int *)malloc(100*sizeof(int)); ///申请空间    if(!S.base)///申请空间失败    {        return -1;    }    S.top = S.base;    S.stacksize = 100;///栈的初始大小为100    return 1;}int Destroystack(Sqstack &S)///销毁栈{    S.top = NULL;    S.stacksize = 0;    free(S.base);    return 1;}int clearstack(Sqstack &S)///请空栈{    S.top=S.base;    return 1;}int Stackempty(Sqstack &S)///判断栈是否为空{    if(S.top == S.base)    {        return -1;    }    else    {        return 1;    }}int Stacklen(Sqstack &S)///获得栈的长度{    if(S.top == S.base)    {        return 0;    }    else    {        return (S.top - S.base);    }}int Gettop(Sqstack &S)///获得栈顶元素{    int e;    if(S.top ==S.base)    {        return -1;    }    else    {        e=*(S.top-1);    }    return e;}int Push(Sqstack &S,int &e)///元素e入栈{    if(S.top - S.base >=100)///空间不足    {        S.base = (int*)realloc(S.base,(S.stacksize + 10)*sizeof(int));        if(!S.base)        {            return -1;        }        S.top  =  S.base +100;        S.stacksize +=10;    }    *S.top = e;///如栈操作    S.top++;    return 1;}int Pop(Sqstack &S, int &e)///栈顶元素出栈,并用e返回其值{    if(S.top == S.base)    {        return -1;    }    else    {        S.top--;        e=*S.top;        return e;    }}int Stacktraverse(Sqstack &S)///遍历输出该栈元素{    if(S.base == NULL)    {        return -1;    }    int *p;    p = S.base;    while(p<S.top)    {        printf("%d ",*p);        p++;    }    printf("\n");    return 1;}int main(){    int n;    int num[1005];    int num2[1005];    Sqstack S;    Initsatck(S);    if(Stackempty(S))    {        printf("此栈为空\n\n\n");    }    printf("请输入栈中的元素个数\n");    while(~scanf("%d",&n))    {        printf("请输入栈内元素:\n");        for(int i=0; i<n; i++)        {            scanf("%d",&num[i]);            Push(S,num[i]);        }        int del,e2;        printf("请输入想插入的元素的值以及位置\n");        scanf("%d %d",&del,&e2);        for(int i=0; i<n-del+1; i++)        {            num2[i]=Pop(S,num2[i]);        }        Push(S,e2);        Stacktraverse(S);        for(int i=n-del; i>=0; i--)        {            Push(S,num2[i]);        }        printf("插入后栈内的元素为\n");        Stacktraverse(S);        printf("请输入删除元素的位置:\n");        int del2;        scanf("%d",del2);        M(num2,0);        for(int i=0; i<n-del+2; i++)        {            num2[i]=Pop(S,num2[i]);        }        printf("所删除的元素是:");        printf("%d\n",num2[n-del-1]);        for(int i=n-del; i>=0; i--)        {            Push(S,num2[i]);        }        printf("删除该元素后栈里元素为:\n");        Stacktraverse(S);    }    return 0;}


运行图 :




原创粉丝点击