栈的基本操作

把栈的基本操作写成了一个小小的子系统,仅供参考

/*
    栈结构的栈底元素的next域为空 栈顶的next域指向第二个元素位置
*/
#include <stdio.h>
#include <stdlib.h>
typedef char datatype;
typedef struct stacknode  // 定义栈节点结构
{
    datatype data;
    struct stacknode*next;
}stacknode;

typedef struct  // 定义栈链结构
{
    struct stacknode * top;
}linkstack;
linkstack *s = NULL;

linkstack *initstack(linkstack *s)  // 置空栈
{
    s = (linkstack *)malloc(sizeof(linkstack));
    s->top = NULL;
    return s;
}

void push(linkstack *s, datatype x)  // 入栈
{
    stacknode *p;
    p = (stacknode *)malloc(sizeof(stacknode));
    p->data = x;
    p->next = s->top;   // 指向下一节点 相当于自增
    s->top = p;
}

void pop(linkstack *s)  // 出栈
{
    if (s->top == NULL)
    {
        printf("请先入栈\n");
        return ;
    }
//栈结构的栈底元素的next域为空 栈顶的next域指向第二个元素位置
    stacknode *p;
    p = s->top;   //指向栈顶
    s->top = p->next;  // 修改栈顶指针

    printf("当前栈顶元素 %c 已出\n",p->data);
    free(p);

}
void show(linkstack *s)  //显示栈
{
    if (s->top == NULL)
    {
        printf("请先入栈\n");
        return ;
    }
    stacknode *p;
    p = s->top;

    printf("栈顶到栈底元素为:");
    while (p !=  NULL)
    {
        printf("%c ", p->data);
        p = p->next;
    }
    printf("\n");
}
int main()
{
    while (1)
    {

        printf("*********************************\n");
        printf("*\t 1\t置空栈\t\t*\n");
        printf("*\t 2\t入栈\t\t*\n");
        printf("*\t 3\t出栈\t\t*\n");
        printf("*\t 4\t显示栈\t\t*\n");
        printf("*\t 5\t销毁栈\t\t*\n");
        printf("*\t 0\t返回\t\t*\n");
        printf("*********************************\n");
        printf("请输入一个数字\n");
        int i;
        scanf("%d",&i);
        getchar();
        if (i == 1)
        {

            s = initstack(s);
            printf("栈已创建\n");
        }
        else if (i == 2)
        {
            if (s == NULL)
            {
                printf("先创建栈\n");
                continue;
            }

            printf("请输入一个元素以#结束\n");
            datatype x;
            scanf("%c",&x);
            getchar();
            while (x != '#')
            {
                  push(s,x);
                  printf("请输入一个元素以#结束\n");
                  scanf("%c",&x);
                  getchar();
            }
            printf("入栈成功\n");
        }
        else if (i == 3)  // 出栈
        {
            if (s == NULL)
            {
                printf("请先建栈\n");
                continue;
            }
            pop(s);
        }
        else if (i == 4) //显示栈
        {
            if (s == NULL)
            {
                printf("请先建栈\n");
                continue;
            }
            show(s);
        }
        else if (i == 5)  // 销毁栈
        {
            if (s == NULL)
            {
                printf("请先建栈\n");
                continue;
            }
            free(s);   //释放s意思是释放s所指的空间,s还存在
            s = NULL;  // 将s指向NULL;
            printf("栈已销毁\n");
        }
        else if (i == 0)
        {
            return 0;
        }
        else
            printf("你输入的数字有误\n");
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值