顺序栈与两栈共享空间-C语言实现

栈是一种只能允许在栈顶插入数据与删除数据的数据结构,其实这就是一种特殊的线性表,特殊在 只能在表尾进行增减元素,上代码

 

#include <stdio.h>

#define MAXSIZE 20                    //栈空间大小
typedef int SElemType;                //元素类型
typedef int Status;                    //返回值类型
#define OK 1                        //操作成功
#define ERROR 0                        //操作失败

typedef struct                        //顺序栈的数据结构
{
    SElemType date[MAXSIZE];        //栈元素数据
    int top;                        //栈顶指针
}SeqStack;                            //栈名

/*入栈操作*/
Status Push(SeqStack *S, SElemType e)
{
    if(S->top == MAXSIZE-1)                //判断栈是否已满
        return ERROR;
    S->date[++S->top] = e;                //栈顶指针加1,栈顶元素等于e
    return OK;
}

/*出栈操作*/
Status Pop(SeqStack *S, SElemType *e)
{
    if(S->top == -1)                    //判断栈是否为空
        return ERROR;
    *e = S->date[S->top--];                //将栈顶元素赋值与e,并将栈顶指针减1
    return OK;
}


void main()
{
    SeqStack S;            //创建栈S
    S.top = -1;            //栈顶指针为-1,栈为空
    int e;                //入栈与出栈的元素

    while(true)
    {
        printf("请选择对顺序栈的操作:\n");
        printf("1.入栈\n");
        printf("2.出栈\n");
        printf("3.退出\n");
        int a;
        scanf("%d", &a);
        switch(a)
        {
            case 1:
                printf("请输入入栈的元素:");
                scanf("%d", &e);
                if(Push(&S, e))
                    printf("入栈成功\n");
                else
                    printf("入栈失败\n");
                break;
            case 2:
                if(Pop(&S, &e))
                    printf("出栈的元素为:%d\n",e);
                else
                    printf("栈空\n");
                break;
            case 3:
                return;
            default:
                printf("选择错误\n");
                break;
        }
    }
}

 

顺序栈中有一类比较特殊的栈,就是两个数据类型一样的栈可以共享同一个数组空间,从而可以节约内存空间。

 

#include<stdio.h>
#define MAXSIZE 100                            //栈空间大小
typedef int ElemType;                        //元素类型
typedef int Status;                            //返回值类型
#define OK 1                                //操作成功
#define ERROR 0                                //操作失败

typedef struct                                //共享栈结构体
{
    ElemType date[MAXSIZE];                    //栈元素
    int top1;                                //栈1栈顶指针
    int top2;                                //栈2栈顶指针
}SeqDoubleStack;                            //栈名


/*双向栈的入栈操作*/
Status Push(SeqDoubleStack *S, int flag, ElemType e)
{
    if(S->top1 + 1 == S->top2)                //判断栈是否已满
        return ERROR;
    if(flag == 1)                            //若flag等于1,则对栈1操作
        S->date[++S->top1] = e;                //将栈1指针加1,并赋值为e
    if(flag == 2)                            //若为2,对栈2操作
        S->date[--S->top2] = e;                //将栈2指针减1,并赋值为e
    return OK;
}

/*双向栈的出栈操作*/
Status Pop(SeqDoubleStack *S, int flag, ElemType *e)
{
    if(flag == 1 && S->top1 != -1)            //若flag为1且栈1栈顶不是-1
    {
        *e = S->date[S->top1--];            //将栈顶元素赋值给e,并将栈顶减1
        return OK;
    }
    if(flag == 2 && S->top2 != MAXSIZE)        //若flag为2且栈2栈顶不是MAXSIZE
    {
        *e = S->date[S->top2++];            //将栈顶元素赋值给e,并将栈顶加1
        return OK;
    }
    return ERROR;
}

void main()
{
    SeqDoubleStack S;            //创建栈S
    S.top1 = -1;            //栈顶1指针为-1,栈为空
    S.top2 = MAXSIZE;        //栈顶2指针为MAXSIZE,栈为空
    int e;                //入栈与出栈的元素

    while(true)
    {
        printf("请选择对顺序栈的操作:\n");
        printf("1.栈1入栈\n");
        printf("2.栈2入栈\n");
        printf("3.栈1出栈\n");
        printf("4.栈2出栈\n");
        printf("5.退出\n");
        int a;
        scanf("%d", &a);
        switch(a)
        {
            case 1:
                printf("请输入入栈1的元素:");
                scanf("%d", &e);
                if(Push(&S, 1, e))
                    printf("入栈成功\n");
                else
                    printf("入栈失败\n");
                break;
            case 2:
                printf("请输入入栈2的元素:");
                scanf("%d", &e);
                if(Push(&S, 2, e))
                    printf("入栈成功\n");
                else
                    printf("入栈失败\n");
                break;
            case 3:
                if(Pop(&S, 1, &e))
                    printf("出栈的元素为:%d\n",e);
                else
                    printf("栈空\n");
                break;
            case 4:
                if(Pop(&S, 2, &e))
                    printf("出栈的元素为:%d\n",e);
                else
                    printf("栈空\n");
                break;
            case 5:
                return;
            default:
                printf("选择错误\n");
                break;
        }
    }
}

 

使用这种结构时,大多是这两个栈的空间需求有相反关系,使得在一个栈的元素个数增多时,另一个栈的元素个数会相对减少,比如股票的买卖可以使用这种结构,因为你买入的时候,就一定是有人卖出了;你挣钱的时候,就一定是有人赔钱了。如果这两个栈没有什么关系,那么对于内存的节省是不明显的,因为随时都有溢出的可能,那这就没有什么意义了。

 

posted @ 2018-08-21 21:29  哈哈瑞  阅读(1110)  评论(0编辑  收藏  举报