标题:求大佬帮我看看我设计的栈有什么问题
只看楼主
心空之上
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2018-5-29
结帖率:83.33%
已结贴  问题点数:20 回复次数:10 
求大佬帮我看看我设计的栈有什么问题
程序要求是读取用户输入的字符串,将字符串的字符逐个压入栈,然后从栈中弹出这些字符,即为该字符串的逆序。
我仿照课本的链表设计了一个栈,想法是这样的,node节点记录当前字符,上一个node的地址以及下一个node的地址。stack记录链表的开头和结尾,以及项数。
程序在读取字符到栈中没问题,但是在弹出栈时,弹出字符串的最后一个字符就终止程序了。不知道自己的程序有什么问题,求大佬指教。
程序代码:
//头文件
#ifndef _STACK_H_
#define _STACK_H_
#include <stdbool.h>

typedef char Item;

typedef struct node
{
    Item item;
    struct node * next;
    struct node * prev;
} Node;

typedef struct stack
{
    Node * front;
    Node * rear;
    int items;
} Stack;

void InitializeStack(Stack * ps);

bool StackIsFull( const Stack * ps);

bool StackIsEmpty(const Stack * ps);

int StackItemCount(const Stack * ps);

bool EnStack(Item item, Stack * ps);

bool Destack(Item *item, Stack * ps);

void EmptyTheStack(Stack * ps);

#endif

程序代码:
//实现程序
#include <stdio.h>
#include <stdlib.h>
#include "stack.h"

void InitializeStack(Stack * ps)
{
    ps->front = NULL;
    ps->rear = NULL;
    ps->items = 0;
}

bool StackIsFull( const Stack * ps)
{
    Node * pt;
    
    pt = (Node*)malloc(sizeof(Node));
    if(pt == NULL)
    {
        return true;
    }
    else
    {
        return false;
    }
    
    free(pt);
}

bool StackIsEmpty(const Stack * ps)
{
    return ps->items == 0;
}

int StackItemCount(const Stack * ps)
{
    return ps->items;
}

bool EnStack(Item item, Stack * ps)
{
    Node * pnew;
    
    if(StackIsFull(ps))
        return false;
    pnew = (Node*)malloc(sizeof(Node));
    if(pnew == NULL)
    {
        fprintf(stderr, "Unable to allocate memory!\n");
        exit(1);
    }
    pnew->item = item;
    pnew->next = NULL;
    
    if(StackIsEmpty(ps))
    {
        pnew->prev = NULL;
        ps->front = pnew;
        ps->rear = pnew;
    }
    else
    {
        ps->rear->next = pnew;
        ps->rear->prev = ps->rear;
    }
    ps->rear = pnew;
    ps->items++;
    
    return true;
}

bool DeStack(Item *item, Stack * ps)
{
    Node * pt;
    if(StackIsEmpty(ps))
        return false;
    *item = ps->rear->item;
    pt = ps->rear;
    ps->rear = ps->rear->prev;
    free(pt);
    ps->items--;
    if(ps->items == 0)
        ps->rear = NULL;
        
    return true;
}

void EmptyTheStack(Stack * ps)
{
    ps->items = 0;
}

程序代码:
//测试程序
#include <stdio.h>
#include <string.h>
#include "stack.h"

int main(void)
{
    char st[256];
    char temp;
    int i;
    Stack stch;
    
    puts("请输入一个字符串");
    gets(st);
    InitializeStack(&stch);
    for(i = 0; i < strlen(st); i++)
    {
        if(!StackIsFull(&stch))
        {
            temp = st[i];
            EnStack(temp, &stch);
        }
    }
    printf("%d\n", StackItemCount(&stch));
    while(!StackIsEmpty(&stch))
    {
        DeStack(&temp, &stch);
        putchar(temp);
    }
    putchar('\n');
    EmptyTheStack(&stch);
    
    return 0; 
     
}


[此贴子已经被作者于2018-9-30 11:07编辑过]

搜索更多相关主题的帖子: node stack bool Item return 
2018-09-30 11:05
心空之上
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2018-5-29
得分:0 
程序运行的结果是这样的:读取"hello"
弹出o后转圈就终止程序了
2018-09-30 11:06
心空之上
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2018-5-29
得分:0 
顶,求助,我觉得是EnStack或者DeStack这两个函数有问题,但不知道怎么改。。
2018-10-01 22:28
MeandC
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:8
帖 子:245
专家分:792
注 册:2018-7-14
得分:20 

你看一下这一行咯

[此贴子已经被作者于2018-10-1 23:05编辑过]



Untitled.png (44.65 KB)

C果然是有点难啊!
2018-10-01 22:57
心空之上
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2018-5-29
得分:0 
回复 4楼 MeandC
gets不是获取字符串的函数吗
2018-10-01 23:02
心空之上
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2018-5-29
得分:0 
回复 4楼 MeandC
这需要你把头文件,实现文件和测试文件一起编译才行,头文件要命名为stack.h
2018-10-01 23:06
MeandC
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:8
帖 子:245
专家分:792
注 册:2018-7-14
得分:0 
回复 5楼 心空之上
OK OK,可以编译了

C果然是有点难啊!
2018-10-01 23:08
心空之上
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2018-5-29
得分:0 
回复 4楼 MeandC
不明白这是啥意思。。怎么解决
2018-10-01 23:10
MeandC
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:8
帖 子:245
专家分:792
注 册:2018-7-14
得分:0 
bool Destack(Item *item, Stack * ps);
bool DeStack(Item *item, Stack * ps)
{
    Node * pt;
    if(StackIsEmpty(ps))
        return false;
    *item = ps->rear->item;
    pt = ps->rear;
    ps->rear = ps->rear->prev;
    free(pt);
    ps->items--;
    if(ps->items == 0)
        ps->rear = NULL;
        
    return true;
}

申明和定义的函数名都不一样

C果然是有点难啊!
2018-10-01 23:14
MeandC
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:8
帖 子:245
专家分:792
注 册:2018-7-14
得分:0 
回复 8楼 心空之上
第二次输出时那个指针指向的值都没有了,我也是新手啊看不懂,你自己慢慢调吧


[此贴子已经被作者于2018-10-2 00:21编辑过]



Untitled.png (129.36 KB)

C果然是有点难啊!
2018-10-01 23:21



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




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

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