创建临时堆栈以在 c 中打印它
creating temp stack to print it in c
我和当前的大学学生的任务是使用以下结构创建堆栈
typedef char stackitem;
struct stack {
stackitem d;
struct stack *next;
};
typedef struct stack ELEMENT;
typedef ELEMENT *POINTER;
我在打印堆栈时遇到问题。我想要做的是创建一个临时堆栈,我在其中打印元素然后将其弹出。但是它似乎正在从我不想要的原始堆栈中删除它。
代码如下:
void print_stack(POINTER Top)
/*Print the contents of the stack. Do not modify the stack in any way. */
{
POINTER temp = Top;
printf("Start printing the stack ...\n");
while (temp != NULL){
printf("%c\n",temp->d);
pop(&temp);
}
}
void pop(POINTER *Top)
/* Remove the top item */
{
POINTER Top1 = *Top;
if (Top != NULL)
{
*Top = Top1->next;
// printf("Remove element %c\n", Top1->d);
free(Top1);
}
else
printf("Empty stack.\n");
}
在我看来,我正在从临时指针打印和弹出,这不应该影响原始指针顶部但是当我插入堆栈并打印它时,第一次打印正确然后第二次打印什么都不打印.
这是我的主
POINTER top;
top= (POINTER) NULL;
stackitem A='A';
stackitem B='B';
push(&top,A);
push(&top,B);
print_stack(top); // prints B A
print_stack(top); // prints nothing
对出了什么问题有帮助吗?
print_stack
函数声称它不会修改堆栈,但确实如此。例如,它调用 pop
调用 free
,销毁堆栈顶部的对象。
正如另一位用户所建议的,您不会创建第二个堆栈,而只是创建第二个指针来显示与原始堆栈相同的内存位置。
如果我是你,我会尝试将堆栈添加到一个数组 (you can search for guidance here) 中,然后修改该数组。这样你的原始堆栈就不会受到伤害。
您的 print_stack()
方法当前如下所示:
void print_stack(POINTER Top) {
POINTER temp = Top;
printf("Start printing the stack ...\n");
while (temp != NULL){
printf("%c\n",temp->d);
pop(&temp); // Calling `pop()` will modify your Stack
}
}
您在修改堆栈的循环中调用 pop()
;这不好,因为 print_stack
是读取操作,不应修改列表。您可以改为只增加指针,使其指向下一个值:
void print_stack(POINTER Top) {
POINTER temp = Top;
printf("Start printing the stack ...\n");
while (temp != NULL){
printf("%c\n",temp->d);
temp = temp->next; // Go to next element of stack
}
}
我测试了这段代码(我只需要添加不存在的额外 push
和 createNewStackNode
方法:
// ...
POINTER createNewStackNode(stackitem i) {
POINTER newNode = (POINTER) malloc(sizeof(ELEMENT));
newNode->d = i;
newNode->next = NULL;
return newNode;
}
void push(POINTER *top, char item) {
POINTER curr = createNewStackNode(item);
curr->next = *top;
*top = curr;
}
// ...
int main() {
POINTER top;
top= (POINTER) NULL;
stackitem A='A';
stackitem B='B';
push(&top,A);
push(&top,B);
print_stack(top); // prints B A
push(&top, 'C');
push(&top, 'D');
push(&top, 'E');
push(&top, 'F');
print_stack(top);
}
这将打印以下输出:
Start printing the stack ...
B
A
Start printing the stack ...
F
E
D
C
B
A
我和当前的大学学生的任务是使用以下结构创建堆栈
typedef char stackitem;
struct stack {
stackitem d;
struct stack *next;
};
typedef struct stack ELEMENT;
typedef ELEMENT *POINTER;
我在打印堆栈时遇到问题。我想要做的是创建一个临时堆栈,我在其中打印元素然后将其弹出。但是它似乎正在从我不想要的原始堆栈中删除它。
代码如下:
void print_stack(POINTER Top)
/*Print the contents of the stack. Do not modify the stack in any way. */
{
POINTER temp = Top;
printf("Start printing the stack ...\n");
while (temp != NULL){
printf("%c\n",temp->d);
pop(&temp);
}
}
void pop(POINTER *Top)
/* Remove the top item */
{
POINTER Top1 = *Top;
if (Top != NULL)
{
*Top = Top1->next;
// printf("Remove element %c\n", Top1->d);
free(Top1);
}
else
printf("Empty stack.\n");
}
在我看来,我正在从临时指针打印和弹出,这不应该影响原始指针顶部但是当我插入堆栈并打印它时,第一次打印正确然后第二次打印什么都不打印.
这是我的主
POINTER top;
top= (POINTER) NULL;
stackitem A='A';
stackitem B='B';
push(&top,A);
push(&top,B);
print_stack(top); // prints B A
print_stack(top); // prints nothing
对出了什么问题有帮助吗?
print_stack
函数声称它不会修改堆栈,但确实如此。例如,它调用 pop
调用 free
,销毁堆栈顶部的对象。
正如另一位用户所建议的,您不会创建第二个堆栈,而只是创建第二个指针来显示与原始堆栈相同的内存位置。
如果我是你,我会尝试将堆栈添加到一个数组 (you can search for guidance here) 中,然后修改该数组。这样你的原始堆栈就不会受到伤害。
您的 print_stack()
方法当前如下所示:
void print_stack(POINTER Top) {
POINTER temp = Top;
printf("Start printing the stack ...\n");
while (temp != NULL){
printf("%c\n",temp->d);
pop(&temp); // Calling `pop()` will modify your Stack
}
}
您在修改堆栈的循环中调用 pop()
;这不好,因为 print_stack
是读取操作,不应修改列表。您可以改为只增加指针,使其指向下一个值:
void print_stack(POINTER Top) {
POINTER temp = Top;
printf("Start printing the stack ...\n");
while (temp != NULL){
printf("%c\n",temp->d);
temp = temp->next; // Go to next element of stack
}
}
我测试了这段代码(我只需要添加不存在的额外 push
和 createNewStackNode
方法:
// ...
POINTER createNewStackNode(stackitem i) {
POINTER newNode = (POINTER) malloc(sizeof(ELEMENT));
newNode->d = i;
newNode->next = NULL;
return newNode;
}
void push(POINTER *top, char item) {
POINTER curr = createNewStackNode(item);
curr->next = *top;
*top = curr;
}
// ...
int main() {
POINTER top;
top= (POINTER) NULL;
stackitem A='A';
stackitem B='B';
push(&top,A);
push(&top,B);
print_stack(top); // prints B A
push(&top, 'C');
push(&top, 'D');
push(&top, 'E');
push(&top, 'F');
print_stack(top);
}
这将打印以下输出:
Start printing the stack ...
B
A
Start printing the stack ...
F
E
D
C
B
A