gpt4 book ai didi

c - C语言中的栈,如何实现

转载 作者:行者123 更新时间:2023-11-30 20:21:05 25 4
gpt4 key购买 nike

struct stack
{
int value;
struct stos *w;

};

struct stack *pnt;
struct stack *prev;

void push(value);
void delete(struct stack *new);
void print_stack();
void push(int x)
{
prev = pnt;
pnt = (struct stack*)malloc(sizeof(struct stack));
pnt->value=x;
pnt->w = prev;
printf("Top of stack: %d\n", pnt->value);
}

void delete(struct stack *new)
{
if (new!=NULL)
{
prev = new->w;
printf("Deleted: %d\n", new->value);
free(new);
pnt = prev;
}
else printf("Stack is empty\n");
}

void print_stack()
{
printf("Content of stack:\n");
prev = pnt;
while (prev!=NULL)
{
printf("%d\n", prev->value);
prev = prev->w;
}
}

我对那里的指针有疑问。不是每个指针的含义(可能意味着堆栈顶部),而是“prev”和“pnt”的含义。我根本不明白。 “Prev”可能是堆栈的前一个值?也许有人可以给我看一张照片。

最佳答案

pnt 是一个指针,由以下声明:

struct stack *pnt;
struct stack *prev;

它指向由 声明的堆栈

struct stack
{
int value;
struct stos *w; // struct stos should struct stack

};

您在其他代码中缺少此声明。

typedef struct stos{

int value;
struct stos *next;

} stos;

所以,这是有问题的提升代码,很多问题......

让我们开始

首先修复 stos 困惑:

上面两个结构体的问题已解决(复制/粘贴),因此不是包含指向相同类型结构体的指针的struct stack而是寻找未定义的结构struct stos *next ; 应该是 struct stack* next;

typedef struct Stack;
typedef struct stack {

int value;
Stack* next;

} Stack;

struct stack *pnt; // pnt = pointer top of stack
struct stack *prev; // prev = pointer to the previous stack item

现在我们知道堆栈被保存为堆栈结构的单链表。

让我们破译void Push(int x)

void push(int x)
{
// point prev to pnt, previous to top of stack
prev = pnt;

// create a new item to place on the top of the stack
pnt = (struct stack*)malloc(sizeof(struct stack));

// initial the value member of the new item with x
pnt->value=x;

// point the new item's link point to point the previous top of the stack
pnt->w = prev;

// print the value contained in the new top of the stack item.
printf("Top of stack: %d\n", pnt->value);
}

这个函数是一场灾难,因为它使用关键字new作为变量的名称。是的,new 是用 C++ 编写的。但为什么要为下一个人把事情搞得一团糟。

void delete(struct stos *new)
{
if (new!=NULL)
{
prev = new->w;
printf("Deleted: %d\n", new->value);
free(new);
pnt = prev;
}
else printf("Stack is empty\n");
}

应该写成如下...

    // forward declaration of Stos because it won't be defined until the end of struct it is used in.

typedef struct {

int value;
struct Stack* next;

} Stack;


Stack* pnt; // pnt = pointer top of stack
Stack* prev; // prev = pointer to the previous stack item

使用Stack* pntStack *pnt 表示“称为pnt 的堆栈指针”与“指向堆栈的称为pnt 的指针”。 (还有一个螺旋技巧可以更轻松地阅读这些声明 Q.E.D)

void delete( Stack* pNew)
{
if ( pNew )
{
prev = pNew->w;
printf("Deleted: %d\n", pNew->value);
free(pNew);
pnt = prev;
}
else printf("Stack is empty\n");
}

正如我所说,这是一团糟。重要的是您提出了一个问题,并希望您学到了一些对您的下一段代码有帮助的东西。

  1. 一旦创建了 typedef,就可以使用它。删除struct stack内容

  2. 使变量名称足够长,以便将来的读者能够理解代码Stack* pTopOfStack;

  3. 尽量不要在衍生产品中使用关键字词new

  4. 不要用冗余代码过度拥挤代码

if ( new != NULL )if ( new ) 相比,甚至更好 if ( pNewStackItem )

更好地完全理解代码在做什么,而不是用更多看起来正确、编译和运行的东西使其复杂化。永远不要相信程序员,“抱歉,它可以在我的机器上运行。”

关于c - C语言中的栈,如何实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43858541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com