数据结构笔记04 栈

定义:
抽象数据类型:

栈的顺序存储结构、共享栈的顺序存储结构、栈的链式存储结构

a.栈的顺序存储结构源码

#include <stdio.h>

#define MAXSIZE 100
#define OK    1
#define ERROR 0
#define TRUE  1
#define FALSE 0


typedef int SElemType;
typedef int Status;

typedef struct
{
    SElemType data[MAXSIZE];
    int top;                //栈顶的游标 
}SqStack;

Status Push(SqStack *stHead);
Status Pop(SqStack *stHead);
void showMainFun(SqStack *stHead);

Status Push(SqStack *stHead)
{
    int flag = 1,count1=0,count2;   
    SElemType element;
    SqStack *point = stHead;

    while(flag)
    {
        if(point->top == (MAXSIZE-1))
        {
            puts("此栈以满!"); 
            return ERROR;
        }else
        {
            puts("请输入你要压入的元素值:");
            scanf("%d",&element);
            point->top++;                       //栈顶游标向上移一个单位 
            point->data[point->top] = element;  //将元素值压入栈 
            count1++;                           //此次压栈统计 
        }
        puts("是否继续压栈? 1.是 0.否");
        scanf("%d",&flag);
    }
    count2 = point->top;                        //栈内总数统计 
    count2++;
    printf("\n此次压栈数为:%d,栈内总数为:%d\n",count1,count2); 
    return OK;
}

Status Pop(SqStack *stHead)
{
    int flag = 1;
    SElemType element;
    SqStack *point = stHead;
    while(flag)
    {
        if(point->top == -1)        //栈判空 
        {
            puts("此栈已为空!");
            return ERROR; 
        }else if(point->top == 0)   //栈内只剩一个元素 
        {
            printf("栈顶元素为:%d\n",point->data[point->top]);
            point->top--; 
            return OK;              //弹栈自动结束 
        }else                       //普通情况 
        {
            printf("栈顶元素为:%d\n",point->data[point->top]);
            point->top--; 
        }
        puts("是否继续弹栈? 1.是 0.否");
        scanf("%d",&flag);
    }
    return OK;
}

void showMainFun(SqStack *stHead)
{
    int select,flag = 1;
    SqStack *point = stHead;
    while(flag)
    {
        puts("\t\t\t\t  1.压栈        \t\t\t\t"); 
        puts("\t\t\t\t  2.弹栈        \t\t\t\t"); 
        puts("\t\t\t\t  0.退出            \t\t\t\t");
        scanf("%d",&select);    
        switch(select)
        {
            case 1: Push(point);break;
            case 2: Pop(point);break;           
            case 0: flag = 0;break;
        }       
    }

}

int main()
{
    SqStack st;     //创建一个栈 
    st.top = -1;    //栈顶游标指向 -1,此时栈内没有数值 
    SqStack *stPoint = &st; 
    showMainFun(stPoint);
//  Push(stPoint);
//  Pop(stPoint);
}

b.共享栈的顺序存储结构源码

#include <stdio.h>

#define MAXSIZE 100
#define OK    1
#define ERROR 0
#define TRUE  1
#define FALSE 0

typedef int SElemType;
typedef int Status;

typedef struct
{
    SElemType data[MAXSIZE];
    int top1;       //1号栈的栈顶游标 
    int top2;       //2号栈的栈顶游标 
}SqDoubleStack;     //此结构体类型名 

Status Push(SqDoubleStack *stHead, int stackNumber);
Status Pop(SqDoubleStack *stHead, int stackNumber);
void showMainFun(SqDoubleStack *stHead);

Status Push(SqDoubleStack *stHead, int stackNumber)
{
    int flag = 1;
    SqDoubleStack *point = stHead;
    SElemType element;
    while(flag)
    {
        if((point->top1+1) == (point->top2))    //判断此栈是否已满 
        {
            puts("此栈已满!");
            return ERROR;
        }else if(stackNumber == 1)              //压1号栈 
        {
            puts("请输入你要压栈的元素值:");
            scanf("%d",&element); 
            point->top1++;
            point->data[point->top1] = element;     
        }else                                   //压2号栈 
        {
            puts("请输入你要压栈的元素值:");
            scanf("%d",&element); 
            point->top2--;
            point->data[point->top2] = element;         
        }
        puts("是否继续压栈? 1.是  0.否");
        scanf("%d",&flag);
    }   
}

Status Pop(SqDoubleStack *stHead, int stackNumber)
{
    int flag = 1;
    SqDoubleStack *point = stHead;
    SElemType element;
    if(stackNumber == 1)                //  判断弹1号栈 
    {
        while(flag)
        {
            if(point->top1 == -1)
            {
                puts("此栈已为空!");
                return ERROR; 
            }else if(point->top1 == 0)
            {
                printf("栈顶元素为:%d\n",point->data[point->top1]);
                point->top1--; 
                return OK;
            }else
            {
                printf("栈顶元素为:%d\n",point->data[point->top1]);
                point->top1--; 
            }
            puts("是否继续弹此栈(1号栈)? 1.是 0.否");
            scanf("%d",&flag);
        }
        return OK;
    }else                           //判断弹2号栈 
    {
        while(flag)
        {
            if(point->top2 == MAXSIZE)
            {
                puts("此栈已为空!");
                return ERROR; 
            }else if(point->top2 == (MAXSIZE-1))
            {
                printf("栈顶元素为:%d\n",point->data[point->top2]);
                point->top2++; 
                return OK;
            }else
            {
                printf("栈顶元素为:%d\n",point->data[point->top2]);
                point->top2++; 
            }
            puts("是否继续弹此栈(2号栈)? 1.是 0.否");
            scanf("%d",&flag);
        }
        return OK;
    }
}

void showMainFun(SqDoubleStack *stHead)
{
    int select,flag = 1;
    SqDoubleStack *point = stHead;
    while(flag)
    {
        puts("\t\t\t\t  1.压栈(1号栈)       \t\t\t\t"); 
        puts("\t\t\t\t  2.压栈(2号栈)       \t\t\t\t");
        puts("\t\t\t\t  3.弹栈(1号栈)       \t\t\t\t");
        puts("\t\t\t\t  4.弹栈(2号栈)       \t\t\t\t"); 
        puts("\t\t\t\t  0.退出            \t\t\t\t");
        scanf("%d",&select);    
        switch(select)
        {
            case 1: Push(point, 1);break;
            case 2: Push(point, 2);break;
            case 3: Pop(point, 1);break; 
            case 4: Pop(point, 2);break;            
            case 0: flag = 0;break;
        }       
    }

}

int main()
{
    SqDoubleStack dst;      //创建一个栈 
    dst.top1 = -1;          //1号栈栈顶游标为-1 
    dst.top2 = MAXSIZE;     //2号栈栈顶游标为MAXSIZE 
    SqDoubleStack *dstPoint = &dst;
    showMainFun(dstPoint);

}

c.栈的链式存储结构源码

#include <stdio.h>
#include <malloc.h>

#define MAXSIZE 100
#define OK    1
#define ERROR 0
#define TRUE  1
#define FALSE 0

typedef int SElemType;
typedef int Status;

typedef struct StackNode        //链栈每个栈元素结点结构体 
{
    SElemType data;             //结点数据 
    struct StackNode *next;     //结点指针 
}StackNode,*LinkStackPtr;

typedef struct LinkStack        //栈顶标志结构体 
{
    LinkStackPtr top;           //定义一个栈元素结点的指针 
//  StackNode *top;             //与上一句功能一样 
    int count;                  //统计栈元素个数 
}LinkStack;

Status linkListPush(LinkStack *point);
Status linkListPop(LinkStack *point);
void showMainFun(LinkStack *point); 

Status linkListPush(LinkStack *point)       //压栈 
{
    int flag = 1;
    SElemType e;
    LinkStackPtr pNew;          //定义一个栈元素结点类型指针; 

    while(flag)
    {
        pNew = (LinkStackPtr)malloc(sizeof(StackNode));     //为栈元素结点开辟内存空间 
        puts("请输入压栈的元素值:");
        scanf("%d",&e);
        if(point->count == 0)       //栈为空第一次压栈的情况 
        {
            pNew->next = NULL;      //将第一个栈元素的指针域置空; 
            pNew->data = e;         //将第一个栈元素的数据域赋值 
            point->top = pNew;      //将第一个栈元素的首地址赋给 栈顶结构体 中标志栈顶的指针 
            point->count++;         //栈元素加 1 
        }else
        {
            pNew->data = e;             //将第一个栈元素的数据域赋值 
            pNew->next = point->top;    //将之前的栈顶元素 栈顶指针 赋给现在的 栈元素结点指针域,使之链接起来 
            point->top = pNew;          //将现在栈元素的首地址赋给 栈顶结构体 中标志栈顶的指针 
            point->count++;             //栈元素加 1
        }
        puts("压栈成功!");
        puts("是够继续压栈? 1.是  0.否");
        scanf("%d",&flag);
    }       
}

Status linkListPop(LinkStack *point)        //出栈 
{
    int flag = 1;
    LinkStackPtr pCurrent; 
    while(flag)
    {
        if(point->count == 0)           //栈为空 
        {
            puts("此栈已为空!");
            return ERROR;
        }
        else if(point->top->next == NULL)   //最后一个弹出栈的情况 
        {
            printf("弹出的栈顶元素为:%d\n",point->top->data);    
            puts("此栈已为空!");
            pCurrent   = point->top;//为释放栈元素做准备
            point->top = NULL;      //栈顶结构体 中标志栈顶的指针置空 
            point->count = 0;       //栈顶结构体 中栈元素统计置 0 
            free(pCurrent);         //释放栈元素占用的内存空间 
            return OK;              //弹栈自动结束 
        }else if(point->top == NULL)//栈本来就为空,没有入栈的情况 
        {
            puts("此栈已为空!");
        }else
        {
            printf("弹出的栈顶元素为:%d\n",point->top->data);   
            pCurrent   = point->top;        //为释放栈元素做准备         
            point->top = point->top->next;  //栈元素结点的下一栈元素首地址赋给 栈顶结构体 中标志栈顶的指针 
            point->count--;                 //栈元素个数建 1 
            free(pCurrent);                 //释放栈元素占用的内存空间 
        }
        puts("弹栈成功!");
        puts("是够继续弹栈? 1.是  0.否");
        scanf("%d",&flag);
    }   
}

void showMainFun(LinkStack *point)
{
    int select,flag = 1;
    while(flag)
    {
        puts("\t\t\t\t  1.压栈        \t\t\t\t"); 
        puts("\t\t\t\t  2.弹栈        \t\t\t\t"); 
        puts("\t\t\t\t  0.退出            \t\t\t\t");
        scanf("%d",&select);    
        switch(select)
        {
            case 1: linkListPush(point);break;
            case 2: linkListPop(point);break;           
            case 0: flag = 0;break;
        }       
    }

}

int main()
{
    LinkStack test,*point;      //定义一个 栈顶标志结构体 变量 和此类型指针 
    test.count = 0;             //栈顶标志结构体 变量  计数置0 
    test.top   = NULL;          //栈顶标志结构体 变量  标志栈顶指针置空 
    point = &test;              //栈顶标志结构体 变量  的首地址赋给  栈顶标志结构体指针 
    showMainFun(point);

    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值