我现在正在学习堆栈,因此我决定尝试根据Magic the Gathering规则制作一个涉及堆栈的小程序,该程序也遵循LIFO命令。
用户询问他们是否愿意
现在最棘手的部分是我试图允许堆栈中的每个元素都是多个单词。这已经引起了很多问题。
我可以输入一个单词并在while(1)
循环外打印它,但是如果我把它放在里面,一切都会变得很麻烦。有什么想法吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
typedef struct {
char item[SIZE];
int top;
} stack;
void init(stack*);
void push(stack*, char[]);
char pop(stack*);
void init(stack* st) {
st->top = -1;
}
void push(stack* st, char* value) {
if (st->top == SIZE - 1) {
printf("STACK OVERFLOW\n");
return;
}
st->top++;
strcpy(st->item[st->top], value);
}
char pop(stack* st) {
if (st->top == -1) {
printf("STACK UNDERFLOW\n");
return -1;
}
char value;
strcpy(value, st->item[st->top]);
st->top--;
return value;
}
int main() {
stack st1, st2;
int choice;
char val[20];
init(&st1);
init(&st2);
printf("You have priority. What would you like to do?\n\n");
printf("1. Cast a spell\n2. Resolve the next spell\n3. Pass priority\n\n");
while (1) {
scanf("%d", &choice);
switch (choice) {
case 1:
printf("What is the spell?\n\n");
scanf("%[^\n]s", val);
printf("%s", val);
push(&st1, val);
case 2:
strcpy(val, pop(&st1));
printf("%s resolves.\n\n", val);
case 3:
exit(0);
}
}
return 0;
}
答案 0 :(得分:0)
出现错误的原因是由于类型转换。
char pop(stack* st) {
if (st->top == -1) {
printf("STACK UNDERFLOW\n");
return -1;
}
char value;
strcpy(value, st->item[st->top]);
st->top--;
return value;
}
第一件事,在处理数组时不需要传递地址。另一件事是您试图将整个字符串复制到单个字符变量中。因此,您的代码中存在太多类型转换问题。
我建议您制作void数据类型的功能,并在功能块内提供功能。只需使用最高值作为参数调用pop函数,然后在要弹出的函数中打印字符串。 堆栈是零级数据结构,因此不需要输入即可弹出。