栈介绍?
首先,它是一个线性表,准确的说,应该是一个插入、删除受限制的线性表。
它仅仅在表尾进行插入和删除操作的线性表,我们把这种受限制的线性表称为栈。
如果栈的元素在使用时出现了元素变化不可预测的情况,有时很大,有时又很小,这种情况下,则建议使用链栈。
栈作用?
栈的引入简化了程序设计的问题,划分了不同关注层次,使得思考范围缩小,要更加聚焦于我们要解决的问题核心。
既然是一种线性表,在理解之前,先将线性表的操作理解透彻。
进栈:
在栈的顶部进行入栈。
实现代码:
ptemp->next=ps->top;
ps->top=ptemp;
退栈:
在栈的顶部进行出栈。
实现代码:
*vals=ps->top->data;
ps->top=ps->top->next;
清栈:
清栈时当把栈顶的内存地址释放时,需要将下一个栈顶的内存地址先保存下来,以防找不到整个栈。
实现代码:
p=ptemp->next;
free(ptemp);
完整代码:
/*
Name:
Copyright:
Author: 红尘拂客
Date: 29/03/21 21:07
Description: 链栈
*/
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}Node,*PNODE;
typedef struct stack
{
PNODE ptop;
PNODE pbottom;
}STACK,*PSTACK;
void init(PSTACK ps);//初始化
void display(PSTACK ps);//打印
void push(PSTACK ps,int values); //进栈插入值为values
int clear(PSTACK ps);//清空栈 成功返回1 失败返回0;
int pop(PSTACK ps,int *values);//出栈成功返回1 失败返回0;
//int is_empty(PSTACK ps); //成功返回1 失败返回0;
/*------------- 初始化------------*/
void init(PSTACK ps)
{
ps->ptop=(PNODE)malloc(sizeof(Node));//动态分配内存空间;
if(NULL==ps->ptop)
{
printf("分配空间失败!\n");
return;
}
else
{
ps->pbottom=ps->ptop;//开始栈顶指针指向栈底指针
ps->ptop->next=NULL;
printf("栈:分配内存空间成功!\n");
return;
}
}
/*-------------进栈--------------*/
void push(PSTACK ps,int values)
{
PNODE ptemp=(PNODE)malloc(sizeof(Node));
if(NULL==ptemp)
{
printf("分配内存失败!\n");
exit(0);
}
ptemp->data=values;
//
ptemp->next=ps->ptop;//
ps->ptop=ptemp;
return;
}
/*-------------出栈--------------*/
int pop(PSTACK ps,int *values)//出栈成功返回1 失败返回0;
{
PNODE ptemp=ps->ptop;
*values=ptemp->data;//将要删除的元素赋值给values;
//
ps->ptop=ps->ptop->next;//将栈顶指针向下移动一位;
free(ptemp);
ptemp=NULL;
return 1;
}
int clear(PSTACK ps)//清空栈 成功返回1 失败返回0;
{
PNODE ptemp=ps->ptop;
PNODE p=NULL;
if(ps->pbottom==ps->ptop)
{
printf("该栈是一个空栈无法执行清栈操作!!\n");
return 0;
}
while(ps->pbottom!=ptemp)
{
p=ptemp->next;
free(ptemp);
ptemp=p;
}
ps->ptop=ps->pbottom;//此时栈已经被清空了栈顶指针指向栈底;
//
return 1;
}
void display(PSTACK ps)
{
PNODE ptemp=ps->ptop;
printf("打印如下:\n");
while(ptemp!=ps->pbottom)
{
printf("%d ",ptemp->data);
ptemp=ptemp->next;
}
printf("\n");
return;
}
int main()
{
STACK ps;
int values,num_01,num_02;
int result,i,y;
printf("请输入你要入栈的个数:\n");
init(&ps);//初始化栈;
printf("请输入你要入栈的个数:\n");
scanf("%d",&num_01);
for(i=0;i<num_01;i++)
{
printf("请输入栈顶元素值:\n");
scanf("%d",&values);
push(&ps,values);
}
//
display(&ps);
//
printf("请输入你要出栈的个数:\n");
scanf("%d",&num_02);
if(num_02==0)
{
printf("栈元素为空!无法出栈!\n");
}
if(num_02>num_01)
{
printf("出栈个数超出栈中元素!\n");
num_02=num_01;
}
for(i=0;i<num_02;i++)
{
if(pop(&ps,&result))
{
printf("出栈成功!出栈元素:%d\n",result);
}
else
{
printf("出栈失败!\n");
return 0;
}
}
//
display(&ps);
//
getchar();
printf("是否要进行清栈操作(Y/y)!其他则退出系统!\n");
scanf("%c",&y);
if(y=='y'||y=='Y')
{
if(clear(&ps))
{
printf("清栈成功\n");
return 1;
}
else
{
printf("清栈失败!\n");
return 0;
}
}
display(&ps);
return 0;
}
如果内容对你学习有帮助,可以关注、点赞。