#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;
}
运行结果如下: