链式栈的基本操作。这个例子中栈顶指针指到栈顶结点,不过在学习栈的时候,发现有一个有趣的问题:
严蔚敏版的<数据结构>中讲的是顺序栈的栈顶指针在栈顶元素的下一个位置。个人理解:由于判栈为空是这样的:top = base; 所以当插入第一个元素时,base指向这个元素,top+1,以后每次添加新的栈顶元素时,top都要加1,这就导致了栈顶指针永远在栈顶元素的下一个位置上。。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//链栈的基本操作 date 2015/03/28
//结点
typedef struct Node{
int data;
struct Node * next;
}Node ,*p_Node;
//栈
typedef struct Stack{
p_Node top;
p_Node base;
}Stack,* p_Stack;
//出栈
void pop(Stack * s)
{
if(s->top == s->base)
{
return;
}
p_Node node = s->top;
s->top = node->next;
printf("出栈元素: %d \n",node->data);
free(node);
}
//初始化栈
void init_Stack(Stack * s)
{
s->base = (p_Node)malloc(sizeof(Node));
if(s->base == NULL)
{
printf("分配存储空间失败");
exit(-1);
}
s->top = s->base;
s->top->next = NULL;
return;
}
//压栈
void push(Stack * s, int data)
{
p_Node newNode = (p_Node)malloc(sizeof(Node));
newNode->data = data;
newNode->next = s->top;
s->top = newNode;
}
//输出栈的内容
void show_Stack(Stack * s)
{
p_Node p = s->top;
while(p != s->base)
{
printf("%d",p->data);
p = p->next;
}
}
//判断栈是否为空
int is_empty(Stack * s)
{
if(s->top == s->base)
{
return 1;
}else{
return 0;
}
}
int main(void)
{
Stack stack;
p_Stack p = &stack;
push(p,1);
push(p,2);
push(p,4);
push(p,3);
pop(p);
pop(p);
show_Stack(p);
return 0;
}