掌握栈的基本操作:初始化栈,判断空满,入栈,出栈,取栈顶数据元素等
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MAXSIZE 100
typedef struct StackNode{
int data;
StackNode *next;
}StackNode, *LinkStack;
//初始化
void InitStack(LinkStack S)
{
S = (LinkStack)malloc(sizeof(StackNode));
S -> next = NULL;
printf("初始化成功\n");
}
//销毁
void DestoryStack(LinkStack S)
{
LinkStack p=S , q;
while (p->next)
{
q = p;
p = p -> next;
free(q);
}
free(S);
printf("销毁成功\n");
}
//清空
void ClearStack(LinkStack S)
{
LinkStack p=S , q;
while (p->next)
{
q = p;
p = p -> next;
free(q);
}
S -> next = NULL;
printf("清空成功\n");
}
//栈空判别
void EmptyStack(LinkStack S){
if(S->next==NULL){
printf("栈为空\n");
}else{
printf("栈不为空\n");
}
}
//栈满判别
void FullStack(LinkStack S){
int i=0;
LinkStack p=S;
while(p->next){
p=p->next;
i++;
}
if(i==MAXSIZE)
printf("栈满\n");
else
printf("栈不为满\n");
}
//入栈子函数
bool Push(LinkStack S,int e)
{
LinkStack p = (LinkStack)malloc(sizeof(StackNode));
p -> data = e;
p -> next = S;
S = p;
return 1;
}
//入栈
void push(LinkStack S)
{
int e;
printf("请输入入栈元素:");
scanf("%d" , &e);
if (Push(S , e)){
printf("入栈成功\n");
}else{
printf("入栈失败\n");
}
}
//出栈
void Pop(LinkStack S)
{
LinkStack p = S;
if (!p){
printf("当前栈为空");
}else {
S = p -> next;
free(p);
printf("出栈成功\n");
}
}
//获取栈顶元素
void GetTop(LinkStack S)
{
LinkStack p = S;
if (p->next!=NULL){
printf("栈为空\n");
}else {
printf("栈顶元素为:%d\n",p -> data);
}
}
//遍历输出
void print(LinkStack S)
{
LinkStack p = S;
if (p->next==NULL) {
printf("当前栈为空!\n");
}else {
printf("当前栈的元素为:");
while (p->next){
printf("%d " , p -> data);
p = p -> next;
}
printf("\n");
}
}
int main()
{
LinkStack S;
printf("请先输入数字1进行初始化\n");
while(1){
printf("\n");
printf("1.初始化 2.销毁\n");
printf("3.清空 4.栈空判别\n");
printf("5.栈满判别 6.入栈\n");
printf("7.出栈 8.获取栈顶元素\n");
printf("9.遍历输出 10.正常退出\n");
int option;
printf("请输入选项:\n");
scanf("%d",&option);
switch(option){
case 1:
InitStack(S);
break;
case 2:
DestoryStack(S);
break;
case 3:
ClearStack(S);
break;
case 4:
EmptyStack(S);
break;
case 5:
FullStack(S);
break;
case 6:
push(S);
break;
case 7:
Pop(S);
break;
case 8:
GetTop(S);
break;
case 9:
print(S);
break;
case 10:
exit(0);
break;
}
}
return 0;
}
总结
栈空时,top和base的值相等,都指向栈底;栈非空时,top始终指向栈顶元素的上一个位置
入栈:将新元素压入栈顶,栈顶元素加1
出栈:栈顶指针减1,栈顶元素出栈
和顺序栈不同的是,链栈在入栈前不需要判断栈是否满,只需要为入栈元素动态分配一个结点空间,链栈在出栈后需要释放栈顶元素的栈顶空间