我试图在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
Stack2.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()的简单输入突然无法工作。你能帮忙看看吗?谢谢。
答案 0 :(得分:0)
在创建堆栈时,您不必创建节点,我只会创建一个指向顶层节点的指针,然后将其设置为NULL,因此在创建后堆栈将为空。
试试这个:
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);
Stack.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);
}
tryStack.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);
}