真正的栈操作是在栈顶,这里给出的栈是带了头结点的栈,也就是说head->next代表图示栈顶,head->next->data是1
代码实现:
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct snode
{
DataType data;
struct snode *next;
}LSNode;
/*初始化带头结点的链式堆栈,初始化函数中不应该给head指针重新赋新地址,
因为这样会导致外部传入的头节点地址没有被使用,而是初始化函数内部找了个
内存地址,并给该内存地址上变量的next指针域赋值NULL,
而外部的(main函数里的)头结点的next指针域仍然是系统分配随机值
会导致StackNotEmpty函数判断栈任何时候都非空*/
void StackInitiate(LSNode *head)
{
head->next = NULL;
}
/*判断栈是不是空栈,如果是空栈则返回0,是非空栈则返回1,其实判断的是头结点指向的栈顶节点是否为空
栈顶空,表明栈是空栈*/
int StackNotEmpty(LSNode *head)
{
if(head->next == NULL) return 0;
else return 1;
}
/*把数据元素x插入到链式堆栈head的栈顶作为新的栈顶*/
int StackPush(LSNode *spu, DataType x)
{
LSNode *p;
if((p = (LSNode *)malloc(sizeof(LSNode))) == NULL)
{
printf("内存空间不足无法插入!\n");
return 0;
}
p->data = x;
p->next = spu->next; /*新结点链入栈顶*/
spu->next = p;
return 1;
}
int StackPop(LSNode *spo, DataType *d)
{
LSNode *p;
p = (LSNode*)malloc(sizeof(LSNode));
p = spo->next;
if(p == NULL)
{
printf("堆栈已空出错!");
}
*d = p->data;
spo->next = p->next;
free(p);
return 1;
}
/*获取栈顶元素*/
int StackTop(LSNode *head, DataType *d)
{
LSNode *p = head->next;
if(p == NULL)
{
printf("堆栈已空出错!\n");
}
*d = p->data;
return 1;
}
int main()
{
LSNode *stack;
stack = (LSNode *)malloc(sizeof(LSNode));
StackInitiate(stack);
DataType d1 = 1;
DataType d2 = 2;
DataType d3 = 3;
StackPush(stack, d1);
printf("栈中压入:%d\n", d1);
StackPush(stack, d2);
printf("栈中压入:%d\n", d2);
StackPush(stack, d3);
printf("栈中压入:%d\n", d3);
DataType *d4, *d5, *d6;
d4 = (DataType *)(malloc(sizeof(DataType)));
d5 = (DataType *)(malloc(sizeof(DataType)));
d6 = (DataType *)(malloc(sizeof(DataType)));
StackPop(stack, d4);
printf("栈中弹出:%d\n", *d4);
StackPop(stack, d5);
printf("栈中弹出:%d\n", *d5);
StackPop(stack, d6);
printf("栈中弹出:%d\n", *d6);
getchar();
return 0;
}