我试图在 Stack 实现上做一个简单的演示。
这是 Stack2.h:
#ifndef _STACK_H
struct Node;
typedef int ElementType;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;
int IsEmpty(Stack S);
Stack CreateStack(void);
void DisposeStack(Stack S);
void MakeEmpty(Stack S);
void Push(ElementType X, Stack S);
ElementType Top(Stack S);
void Pop(Stack S);
#endif
堆栈2.c:
#include "Stack2.h"
#include <stdlib.h>
struct Node {
ElementType Element;
PtrToNode Next;
};
int IsEmpty(Stack S) {
return S->Next == NULL;
}
Stack CreateStack(void) {
Stack S = malloc(sizeof(struct Node));
MakeEmpty(S);
return S;
}
void DisposeStack(Stack S) {
MakeEmpty(S);
free(S);
}
void MakeEmpty(Stack S) {
while (!IsEmpty(S)) Pop(S);
}
void Push(ElementType X, Stack S) {
PtrToNode newNode = malloc(sizeof(struct Node));
newNode->Element = X;
newNode->Next = S->Next;
S->Next = newNode;
}
ElementType Top(Stack S) {
if (!IsEmpty(S))
return S->Next->Element;
return 0;
}
void Pop(Stack S) {
PtrToNode toPop = S->Next;
S->Next = S->Next->Next;
free(toPop);
}
tryStack.c:
#include <stdio.h>
#include "Stack2.h"
int main() {
int num;
char c;
Stack nums = CreateStack();
while ((c = getchar()) != 'x') {
num = c - '0';
Push(num, nums);
}
while (!IsEmpty(nums)) {
printf("%d\n", Top(nums));
Pop(nums);
}
DisposeStack(nums);
return 0;
}
然后我用以下行编译它们:
gcc tryStack.c Stack2.c -o stackDemo
已编译。然而,在输入命令 stackDemo 后,它没有响应任何键盘上的按键;只有在我终止程序后,我输入的内容才会出现在命令提示符中。这是我输入 123 然后按下 Control-C 后的场景:
C:\C_code>stackDemo
^C
C:\C_code>123
我不明白为什么通过 getchar() 的简单输入突然不起作用。你能帮忙看看吗?谢谢。
最佳答案
在创建堆栈时,您不必创建节点,我只会创建一个指向顶部节点的指针,然后将其设置为 NULL,这样在创建后堆栈将为空。
试试这个:
堆栈.h
struct Node;
typedef int ElementType;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;
int IsEmpty(Stack S);
Stack CreateStack(void);
void DisposeStack(Stack *S);
void MakeEmpty(Stack *S);
void Push(ElementType X, Stack *S);
ElementType Top(Stack S);
void Pop(Stack *S);
堆栈.c
#include "Stack2.h"
#include <stdlib.h>
struct Node {
ElementType Element;
PtrToNode Next;
};
int IsEmpty(Stack S) {
return S == NULL;
}
Stack CreateStack(void) {
Node *S = NULL;
return S;
}
void DisposeStack(Stack *S) {
MakeEmpty(S);
free(*S);
}
void MakeEmpty(Stack *S) {
while (!IsEmpty(*S)) Pop(S);
}
void Push(ElementType X, Stack *S) {
PtrToNode newNode = (PtrToNode)malloc(sizeof(struct Node));
newNode->Element = X;
newNode->Next = NULL;
if (IsEmpty(*S))
{
*S = newNode;
return;
}
newNode->Next = (*S);
*S = newNode;
}
ElementType Top(Stack S) {
if (!IsEmpty(S))
return S->Element;
return 0;
}
void Pop(Stack *S) {
if (IsEmpty(*S)) return;
PtrToNode toPop = *S;
*S = (*S)->Next;
free(toPop);
}
尝试堆栈.c
#include <stdio.h>
#include "Stack2.h"
int main()
{
int num;
char c;
Stack nums = CreateStack();
while ((c = getchar()) != 'x' && (c >= '0' && c <= '9' || c == '\n')) {
if (c == '\n') continue;
num = c - '0';
Push(num, &nums);
}
while (!IsEmpty(nums)) {
printf("%d\n", Top(nums));
Pop(&nums);
}
DisposeStack(&nums);
return 0;
}
输入数字时必须忽略'\n',检查它们是否为数字也很好。
如果您坚持使用您的创建功能,您还可以使用此代码获取不带换行符的输入:
while ((c = getchar()) != 'x' && (c >= '0' && c <= '9' || c == '\n'))
{
if (c == '\n') continue;
num = c - '0';
Push(num, nums);
}
关于c - 我的 C 程序没有检测到键盘输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31892277/