#include<stdio.h>
#include<stdlib.h>
/*棧由節點和棧頂,棧底指針組成,節點由數據域和指向下一個節點的指針域組成,所以棧有兩個結構體*/
typedef struct node * PNode;
typedef struct node{ //定義節點的結構體
int data; //數據域
PNode next; //指針域
}Node;
typedef struct stack{ //定義棧的結構體
PNode top; //棧頂指針
int size; //棧大小
}Stack;
//構造一個空棧
Stack * initStack(Stack *ps){
ps = (Stack *)malloc(sizeof(Stack));
if(ps!=NULL){
ps->top = NULL;
ps->size = 0;
}
return ps;
}
//判斷是否爲空棧
int isEmpty(Stack *ps){
if(ps->top ==NULL&&ps->size==0)
return 1;
else
return 0;
}
//計算棧的大小
int GetSize(Stack *ps){
return ps->size;
}
//元素入棧
void push(Stack *ps,int item){
PNode pnode = (PNode)malloc(sizeof(Node)); //新建一個節點
if(pnode != NULL){
pnode->data = item;
pnode->next = ps->top;
ps->size++;
ps->top = pnode;
}
}
//返回棧頂元素
int GetTop(Stack * ps){
if(isEmpty(ps) == 0){
return ps->top->data;
}
}
//元素出棧
void pop(Stack *ps){
PNode p = ps->top;
if(isEmpty(ps) == 0 && p !=NULL){
ps->size--;
ps->top = ps->top->next;
free(p);
}
}
void ClearStack(Stack *ps){
while(!isEmpty(ps)){
pop(ps);
}
}
//銷燬一個棧
void DestryStack(Stack *ps){
if(!isEmpty(ps))
ClearStack(ps);
free(ps);
}
//遍歷棧
void StackTraverse(Stack *ps){
PNode p = ps->top;
int num = ps->size;
while(num--){
printf("StackTraverse: %d\n",p->data);
p = p->next;
}
}
int main(){
Stack *ps = initStack(ps);
int i;
int num;
for(i = 0;i<10;i++){
push(ps,i);
num = GetTop(ps);
printf("GetTop(): %d\n",num);
}
for(i = 0;i<5;i++)
pop(ps);
StackTraverse(ps);
DestryStack(ps);
printf("isEmpty(): %d",isEmpty(ps));
return 0;
}
運行結果如下: