栈的链式存储

#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