#include<stdlib.h>
#include<stdio.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int SElemType;
typedef int Status;
typedef struct StackNode
{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStack;
LinkStack S; //這裏S是全局變量,後面的代碼就不要再傳這個變量了,S會壹直指向棧頭
//而且,也不要再定義同名的S變量了,大家都犯相同的錯誤!!
//局部變量定義與全局變量名相同,兩個變量會互相影響的,讓程序無所適從,編程者也迷糊
//棧的初始化
void InitStack(void)
{
S=NULL; //妳這裏申請壹個局部變量p沒用啊,刪掉!!
}
//判棧空
Status StackEmpty(LinkStack S)
{
if(S==NULL) return OK;
else return ERROR;
}
//進棧
void LinkStack_Push(SElemType &e)
{
LinkStack p;
p=(LinkStack)malloc(sizeof(LinkStack));
p->data=e;
p->next=S;
S=p;
}
//退棧
void LinkStack_Pop()
{
if( S )
{
LinkStack p;
printf(" %d", S->data ); //加個空格,這樣數據有間隔,看起來舒服點
p=S;
S=S->next;
free(p);
}
}
//取棧頂元素
Status GetLinkStackTop(SElemType &e) //這裏返回取數狀態比較好,因為e為引用,可以直接帶回數據值
{
if(S==NULL) return ERROR;
e = S->data;
return OK ;
}
int main()
{
int i,num;
SElemType n;
InitStack();
//進棧
printf("請輸入要進棧元素的個數:");
scanf("%d",&num);
printf("進棧順序為:");
for(i=0;i<num;i++)
{
scanf("%d",&n);
LinkStack_Push(n);
}
GetLinkStackTop(n);
printf("棧頂元素:%d\n",n);
//退棧
printf("出棧結果為\n"); //這裏多了個%d,因為妳沒參數
while(S)
{
LinkStack_Pop();
}
return 0;
}