#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//栈的链式存储(这里版本就是简单的单链表无头结点版本),这里就是根据栈是先进后出的特性(如同手枪上子弹)进行存储和删除操作的;
//这里push操作,就是简单的单链表的 插入操作
//这里的pop操作,就是简单的单链表的删除操作,但是是从后面开始删除
typedef
struct node{
int digital;
struct node*next;
}Node;
typedef
struct{
int top;
int maxSize;
Node*element;
}seqStack;
void createStack(seqStack*p_myStack,int maxSize);
bool push(seqStack*p_myStack,int);
bool pop(seqStack*p_myStack,int);
bool isFull(seqStack*p_myStack,int maxSize);
bool isEmpty(seqStack*p_myStack);
void outPut(seqStack myStack);
int main(void) {
seqStack myStack;
int maxSize;
printf("请输入大小\n");
scanf("%d",&maxSize);
createStack(&myStack,maxSize);
if(push(&myStack,maxSize))
{
printf("push succeessfully\n");
}else{
printf("push failed\n");
}
// outPut(myStack);
if(pop(&myStack,maxSize))
{
printf("pop succeessfully\n");
}else{
printf("pop failed\n");
}
outPut(myStack);
return 0;
}
void createStack(seqStack*p_myStack,int maxSize)
{
p_myStack->top=-1;
p_myStack->element=NULL;
p_myStack->maxSize=maxSize;
}
bool push(seqStack*p_myStack,int maxsize)//还是经典的尾插法
{
if(isFull(p_myStack,maxsize))
{
return false;
}
//在这里执行插入链表插入操作
Node*last=(Node*)malloc(sizeof(Node));
int data;
printf("请输入要插入的数据(输入零即停止)\n");
scanf("%d",&data);
while(data)//输入零即停止
{
Node*p=(Node*)malloc(sizeof(Node));
p->digital=data;
if(p_myStack->element==NULL)
{
p->next=p_myStack->element;
p_myStack->element=p;
last=p;
}else{
last->next=p;
p->next=NULL;
last=p;
}
scanf("%d",&data);
++p_myStack->top;
if(isFull(p_myStack,maxsize))//这里还是对栈中的元素个数进行判断
{
return false;
}
}
return true;
}
bool pop(seqStack*p_myStack,int maxsize)
{
if(isEmpty(p_myStack))//这里已经考虑了特殊情况 q为空
{
return false;
}
--p_myStack->top;
//在这里执行删除操作(删除最后进的元素);
Node*q=p_myStack->element;
while(q->next)//q->next==NUll即停止
{
q=q->next;
}
free(q);
return true;
}
void outPut(seqStack myStack)
{
Node * p = myStack.element;
while(myStack.top--!=-1)//这里我不用p!=NULL来做判断条件,这里就是一个对pop操作一个简化(不需要考虑如果只有一个头结点的特殊情况)
{
printf("%d ",p->digital);
p=p->next;
}
putchar('\n');
}
bool isFull(seqStack*p_myStack,int maxSize)
{
return p_myStack->top==maxSize?true:false;
}
bool isEmpty(seqStack*p_myStack)
{
printf("size=%d\n",p_myStack->top);
return p_myStack->top==-1?true:false;
}
栈的链式存储
猜你喜欢
转载自blog.csdn.net/weixin_40867255/article/details/83001315
今日推荐
周排行