/*
数据结构:批量存储数据的一种方式
栈结构 FILO:先进后出,后来居上的一种存储方式
栈的基本属性: 栈内存 栈顶标记 栈的当前元素个数
栈的基本操作:
入栈:把数据存储到栈内存中
出栈:把数据从栈内存中删除掉
获取栈顶元素:栈顶标记的元素
根据实现方式:把栈分成两种:
链式栈和数组栈
万金油操作:
判断是否为NULL
当前栈中数据个数
队列 FIFO
先进先出,排列的方式
*/
/*
链表栈: 链表的头插法就可以了
栈内存和栈的区别
栈:一种结构
栈内存:内存的存在形式
实现:用堆内存实现栈结构
*/
#include<stdio.h>
#include<stdlib.h>
/*栈是一种先进后出的结构,就好像是链表的头插法*/
/*链式栈:链表的头插法*/
/*链式栈,有链表的属性*/
//链表结构
//结构体:描述一个单一个体
struct Node
{
int data;
struct Node* next;
};
struct Node* createNode(int data)
{
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;/*我们要为变量的属性初始化,因为变量只有初始化后,我们才能使用*/
newNode->next = NULL;
return newNode;
}
//栈结构
struct stack
{
int sizeStack; /*栈当前元素个数*/
struct Node* stackTop;/*栈顶标记用指针stackTop去表示*/
}
//创建栈:描述栈的最初状态,即为空
struct stack* createStack()
{
struct stack* pStack = (struct stack*)malloc(sizeof(struct stack));
pStack->sizeStack = 0;
pStack->stackTop = NULL;
return pStack;
}
//万金油函数
int size(struct stack* pStack)/*求以pStack为栈顶标记所表示栈的大小*/
{
return pStack->sizeStack;
}
int empty(struct stack* pStack)/*判断是否为空的函数*/
{
return pStack->sizeStack != 0;/*返回 1 表示不为NULL*/
}
/*入栈操作-->链表的头插法 ,这里用无头链表,栈顶指针永远指向第一个结点,为什么指向头结点,因为可以用栈顶指针表示整个链表*/
void push(struct stack* pStack, int data)
/*入栈,入的是以这个栈顶指针指向的这个栈,录的元素是data*/
{
//入栈就是链表的插入操作
struct Node* newNode = createNode(data);
newNode->next = pStack->stackTop;
pStack->stackTop = newNode;
/*栈顶指针永远指向第一个结点*/
pStack->sizeStack++;
}
/*出栈:链表的删除。栈必须先进后出,否则不是栈。出栈:(无头链表的)头删法*/
void pop(struct stack*pStack)
{
if(pStack->sizeStack == 0)
{
printf("栈为空,无法出栈!\n");
return;
}
/*堆内存实现的栈,需要内存释放*/
struct Node* nextNode = pStack->stackTop->next;/*先保存要删除的结点的下一个结点*/
free(pStack->stackTop);
pStack->stackTop=nextNode;
pStack->sizeStack--;
}
/*获取栈顶元素,栈顶所指向的元素*/
int top(struct stack* pStack)
{
if(pStack->sizeStack == 0)
{
printf("栈为空,无法获取栈顶元素\n");
return 0;
}
return pStack->stackTop->data;
}
int main()
{
struct stack* myStack = createStack();
push(myStack,1);
push(myStack,2);
push(myStack,3);
while (empty(myStack))
{
printf("%d\t",top(myStack));
pop(myStack);
}
printf("\n");
system("pause");
return 0;
}
链式栈
最新推荐文章于 2025-03-08 16:26:15 发布