我尽力使用这个程序,但我不知道错误在哪里?我会解释一下这个程序。在这个程序中,我应该实现一个整数堆栈作为链表,使用全局变量指向到使用这些方法的堆栈顶部:
int push(int i);
将i推入堆栈,如果成功则返回1,否则返回0。
int pop();
来自堆栈的pop号码。如果stack empty返回0;
我确实创建了新方法调用int stackEmpty();
和上面的两种方法。
每次我运行我的程序时,都会将数字推入堆栈但弹出不起作用。在这里我的代码:::
#include <stdio.h>
#include <stdlib.h>
typedef struct stack Stack;
struct stack
{
int number;
Stack *next;
};
Stack *top = NULL;
int push(int i);
int count();
int stackEmpty();
int pop();
int main()
{
char op;
int i, x;
printf("Welcome to my stack\n");
printf("p to pop, s to push, c to count, q to quit\n");
while (op != 'q')
{
scanf("%c", &op);
if (op == 'p')
{
x = pop();
if (x == 0)
{
printf("Stack is empty\n");
}
else
{
printf("%d popped\n", pop());
}
}
else if (op == 'c')
{
i = count();
printf("%d numbers on stack\n", i);
}
else if (op == 's')
{
printf("Enter number: ");
scanf("%d", &i);
x = push(i);
if (x == 1 || x == 2)
{
printf("%d puched :: state%d\n", i, x);
}
else
{
printf("faill %d\n", x);
}
}
else if (op == 'q')
{
return 0;
}
}
return 0;
}
int stackEmpty()
{
if (top == NULL)
{
return 1;
}
else
{
return 0;
}
}
int count()
{
int counter = 0;
if (top == NULL)
{
return counter;
}
else
{
while (top != NULL)
{
top = top->next;
counter++;
}
return counter;
}
}
int push(int i)
{
Stack *head;
Stack *next;
Stack *new;
int state;
int m;
head = top;
new = (Stack *) malloc(sizeof(Stack));
if (new == NULL)
{
state = 0;
} new->number = i;
m = stackEmpty();
if (m == 1)
{
head = new;
top = head;
head->next = NULL;
state = 1;
}
else
{
while (head != NULL)
{
if ((next = head->next) == NULL)
next = new;
next->next = NULL;
state = 2;
break;
head = top->next;
next = head->next;
}
top = head;
}
return state;
}
int pop()
{
Stack *head;
int state;
int m;
head = top;
if (head == NULL)
{
state = 0;
}
m = stackEmpty();
if (m == 1)
{
state = 0;
}
else
{
state = head->number;
top = head->next;
free(head);
}
return state;
}
答案 0 :(得分:4)
几个问题:
top
是我认为的堆叠头。在count
{} {}} {} {} {{}}
NULL
分配给count
,但您并未指向列表中的任何位置。new
时,您要调用它两次(一次用于删除元素,一次用于打印)。因此,只要沿着该代码路径移动,就会删除两个元素。一个更好的实现是编写一个next
函数,它返回顶部元素而不删除它,pop
函数只是删除它(表示成功为1,失败为0)推送堆栈的方式如下:
不需要循环。这是O(1)操作。
答案 1 :(得分:1)
你没有正确推动。您正在更改 next ,这是一个局部变量。你没有改变列表尾部的“下一个”值。
答案 2 :(得分:0)
一个问题是您pop()
,然后检查结果,然后在打印时再次pop()
。每次尝试打印时都会弹出两次。
答案 3 :(得分:0)
另一个错误:
while (head != NULL)
{
if ((next = head->next) == NULL)
next = new;
next->next = NULL;
state = 2;
break;
head = top->next;
next = head->next;
}
应该是:
while (head != NULL)
{
if ((next = head->next) == NULL)
{
next = new;
next->next = NULL;
state = 2;
break;
}
head = top->next;
next = head->next;
}
至少,这是你原来的缩进似乎表明的。