今天刚一共写了栈的顺序存储,接下来我把栈的链式存储也发一下吧
1.定义结构体
stackNode结构体储存着链表中结点的信息
stackPointer结构体储存着指向链表尾部(即栈顶)的指针和链表的长度
typedef struct stackNode { ElemType data; //储存数据 struct stackNode *next ;// 指向下一个结点 }stackNode,*stackNodePtr; typedef struct stackPointer { stackNodePtr top; //top指针 ,指向栈顶 int count;//储存栈元素的数量 }stackPointer;
2.初始化声明:链表为空,所以指向链表的指针为null,
void initStack(stackPointer *s) { s->top=NULL; s->count=0;//初始化栈的空间为0 }
3.入栈操作
首先为入栈的数据申请一个结点,
当链表为空时,指向链表的指针指向这个结点,这的结点指针域为空,链表数量增加
当链表不为空时,这个结点的指针指向当前链表的表尾,自己成为这个链表的表尾,然后指向链表尾部的指针指向这个结点,链表数量增加
void push(stackPointer *s,int e) { stackNodePtr currentNode=(stackNodePtr)malloc(sizeof(stackNode)); //为要申请的结点申请空间 currentNode->data=e; if(!currentNode) { printf("动态申请空间失败"); } if(s->count==0)//如果栈的空间原本为空 { s->top=currentNode; currentNode->next=NULL; s->count++; } else //栈的空间不为空 { currentNode->next=s->top; s->top=currentNode; s->count++; } }
4.出栈操作
ElemType pop(stackPointer *s,int *e) { if(s->count==0)//栈为空时 { printf("栈为空,无法出栈 "); return -1; } else { *e=s->top->data;//赋值 s->top=s->top->next;//向下传递 s->count--; return *e; } }
5.清空栈的操作
void clearStack(stackPointer *s) { s->count=0; s->top=NULL; }
6.销毁栈的操作
void destroyStack(stackPointer *s) { int i; stackNodePtr temp; //这里不准用 stackPointer *temp ,因为我们要的只是指向下一个结构体的指针,而不是一个结构体里面存在指向下一个结构体的指针 for(i=0;i<s->count;i++) { temp=s->top->next; free(s->top); s->top=temp; } s->top=NULL; //一开始指向结构体的指针为空 s->count=0; //栈的长度为0 }
所有的代码如下:
#include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct stackNode { ElemType data; //储存数据 struct stackNode *next ;// 指向下一个结点 }stackNode,*stackNodePtr; typedef struct stackPointer { stackNodePtr top; //top指针 ,指向栈顶 int count;//储存栈元素的数量 }stackPointer; //初始化栈的链式存储 void initStack(stackPointer *s) { s->top=NULL; s->count=0;//初始化栈的空间为0 } //入栈 void push(stackPointer *s,int e) { stackNodePtr currentNode=(stackNodePtr)malloc(sizeof(stackNode)); //为要申请的结点申请空间 currentNode->data=e; if(!currentNode) { printf("动态申请空间失败"); } if(s->count==0)//如果栈的空间原本为空 { s->top=currentNode; currentNode->next=NULL; s->count++; } else //栈的空间不为空 { currentNode->next=s->top; s->top=currentNode; s->count++; } } //出栈操作 ElemType pop(stackPointer *s,int *e) { if(s->count==0)//栈为空时 { printf("栈为空,无法出栈 "); return -1; } else { *e=s->top->data;//赋值 s->top=s->top->next;//向下传递 s->count--; return *e; } } //清空栈的操作 void clearStack(stackPointer *s) { s->count=0; s->top=NULL; } //销毁栈 void destroyStack(stackPointer *s) { int i; stackNodePtr temp; //这里不准用 stackPointer *temp ,因为我们要的只是指向下一个结构体的指针,而不是一个结构体里面存在指向下一个结构体的指针 for(i=0;i<s->count;i++) { temp=s->top->next; free(s->top); s->top=temp; } s->top=NULL; //一开始指向结构体的指针为空 s->count=0; //栈的长度为0 } int main() { stackPointer s; initStack(&s);//栈的初始化 printf("结束操作-------0 "); printf("入栈操作-------1 "); printf("出栈操作-------2 "); printf("清空栈的操作-------3 "); printf("销毁栈的操作-------4 "); int number,e; //指令 ,数据 printf("请输入指令"); scanf("%d",&number); while(number!=0) { switch(number) { case 1: //入栈操作 printf("入栈的数值为:"); scanf("%d",&e); push(&s,e); break; case 2: //出栈操作 e=pop(&s,&e); printf("出栈的元素值为:%d ",e); break; case 3: //清空栈的操作 clearStack(&s); printf("栈已清空 "); break; case 4: //销毁栈的操作 destroyStack(&s); printf("栈已销毁 "); break; default: printf("你输入的指令不正确 "); } printf("你的下一步指令为:"); scanf("%d",&number); } return 0; }
这样就结束了,欢迎大家指出我的不足。