链式实现栈及基本操作
1.在完成栈的实现前,我们先来了解什么是栈,栈的存储结构又是什么,举一个简单的例子来了解什么是栈吧,现实生活中我们通常会叠衣服,是不是我们先叠的衣服最后才能拿出来,而后叠的衣服最先拿出来,而栈就是这种先进后出,后进先出的数据结构
栈又由数组和链式两种方式
以下是数组和链式栈的实现原理
数组形式的栈:
链式栈:
2.了解了栈是什么之后,我们用代码来实现栈
(1)首先创建结点结构体变量
struct Node
{
int data; //数据域
struct Node *next; //指针域
};
(2)创建结点
struct Node* creatNode(int data)
{
//通过动态内存申请为指针变量构造空间
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
//初始化结点
newNode->data=data;
newNode->next=NULL;
return newNode;
}
(3)创建栈结构体变量
struct stack
{
struct Node* stackTop; //栈顶指针
int size; //栈中元素的个数
};
(4)创建栈
struct stack* creatstack()
{
//创建栈首结点
struct stack* myStack = (struct stack*)malloc(sizeof(struct stack));
//初始化栈
myStack->stackTop=NULL;
myStack->size=0;
return myStack;
}
栈的创建到此基本上已经完成了,接下来我们来实现栈的基本操作
1.入栈
入栈我们可以理解为表头法插入结点
void push(struct stack* myStack,int data)
{
//调用创造结点函数
struct Node* newNode = creatNode(data);
newNode->next=myStack->stackTop;
myStack->stackTop=newNode;
myStack->size++; //栈元素加一
}
2.获取栈顶元素
int top(struct stack* myStack)
{
if(myStack->size ==NULL)
{
printf("栈为空,无法获取\n");
system("pause");
return myStack->size;
}
return myStack->stackTop->data;
}
3.出栈
void pop(struct stack* myStack)
{
if(myStack->size==0)
{
printf("栈为空,无法出栈");
return myStack->size
}
//找到第二级
struct Node* nextNode=myStack->stackTop->next;
free(myStack)
//出栈之后第二级变为栈顶
myStack->stackTop=nextNode;
//栈中元素减一
myStack->size--;
}
4.判断是否为空栈的函数
int empty(struct stack* myStack)
{
if(myStack->size==0)
return 0;
return 1;
}
栈的基本操作已经完成,栈的创建与链表的创建过程及其的相似,读者可以对比以下相似在哪,若有什么错误希望指出修改