标题:分享:基本链栈操作
只看楼主
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
结帖率:97.5%
已结贴  问题点数:20 回复次数:7 
分享:基本链栈操作
看到论坛有个进制转换的说链栈做,就学了下。
具体实现很简单,跟链表没多大区别。 就多了一个栈顶指针,实际上还是操作尾差法的链表。

程序代码:
#include <stdio.h>
#include <malloc.h>

typedef struct node
{
    int data;
    struct node *next;
}List;

typedef struct stack
{
    int count;
    List *top;
}List_stack;

List_stack *Creat_stack()
{
    List_stack *p;

    p = (List_stack *)malloc(sizeof(p));
    if (p == NULL)
        return p;
    p->count = 0;
    p->top = NULL;

    return p;
}

List_stack *Push_stack(List_stack *p, int elem)
{
    List *temp = NULL;
    temp = (List *)malloc(sizeof(List));
    if (p == NULL || temp == NULL)
        return NULL;

    temp->next = p->top;
    p->top = temp;

    temp->data = elem;
    p->count++;

    return p;

}

void Show_stack(List_stack *p)
{
    List *temp = p->top;
    if (p == NULL)
        printf("The static is empty!\n");
    else
        while (temp != NULL)
        {
            printf("%d ", temp->data);
            temp = temp->next;
        }

}

List_stack *Pop_stack(List_stack *p)
{
    if (p == NULL)
    {
        printf("The static is empty!\n");
        return p;
    }
        
    List *temp = p->top;

    p->top = p->top->next;
    free(temp);
    p->count--;
    
    return p;
}

int main()
{
    List_stack *p;
    int i = 1, n, elem;

    p = Creat_stack();
    printf("How many elements add to stack\n");
    scanf("%d", &n);
    printf("Plese inuput %d elements\n", n);
    for (i = 1; i <= n; i++)
    {
        scanf("%d", &elem);
        p = Push_stack(p, elem);
    }
    printf("Static %d elements :\n", n);
    Show_stack(p);
    printf("\nStack count : %d\n", p->count);

    printf("\nHow many stack elements to delete\n");
    scanf("%d", &n);
    printf("Delete %d elements back:", n);
    while (n-- > 0)
        p = Pop_stack(p);
    Show_stack(p);
    printf("\nStack count : %d\n", p->count);

    printf("\nHow many elements add to stack\n");
    scanf("%d", &n);
    printf("Plese inuput %d elements\n", n);
    for (i = 1; i <= n; i++)
    {
        scanf("%d", &elem);
        p = Push_stack(p, elem);
    }
    printf("Add %d elements back\n", n);
    Show_stack(p);
    printf("\nStack count : %d\n", p->count);

    return 0;

}
搜索更多相关主题的帖子: count NULL temp printf elements 
2017-05-19 22:56
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:7 
表示写过差不多的~写得规范很规范哦~~

[此贴子已经被作者于2017-5-19 23:05编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-19 23:03
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
得分:0 
回复 2楼 九转星河
比起你们大佬还差远了, 望其项背啊!
2017-05-19 23:05
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:7 
还不错的样子了。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-19 23:06
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:7 
当心哦。出栈块的个数更新少个减号
2017-05-20 08:23
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
得分:0 
回复 5楼 yangfrancis
具体哪儿呢?谢谢
2017-05-20 08:32
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
得分:0 
看了半天,终于……算是……有点懂了。

所以说……这个结构到底有什么存在意义啊,难道就是为了丢一个计数器?好吧,计数器又是用来干嘛的。如果是用来判断栈为空,为什么不直接判断指针的值是否为空。反正链表弹出值不是会free掉节点么?
程序代码:
typedef struct stack
{
    int count;
    List *top;
}List_stack;


[此贴子已经被作者于2017-5-20 11:57编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-20 11:23
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
得分:0 
回复 7楼 renkejun1942
那结构可有可无,每个人看法不一样。free确实是多余的

[此贴子已经被作者于2017-5-20 12:34编辑过]

2017-05-20 12:23



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-477172-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.556000 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved