栈的创建和基本操作

栈(LIFO):限定仅在表尾进行插入和删除操作的线性表,简单来说就是最后一个进入最早出来

顺序栈

用数组实现,下标为0的一端作为栈底,另一端为栈顶,用top作为栈顶指针

我们定义空栈时top=-1

栈结构

typedef struct SqStack
{
	int data[MAX];
	int top;	
}SqStack;

 

基本操作

//初始化栈 
void InitStack(SqStack *s)
{
	s->top=-1;
}

//判断栈是否为空 
int Stackempty(SqStack *s)
{
	if(s->top==-1)
		return 0;
	else
		return 1;	
} 

//进栈
int push(SqStack *s,int e)
{
	if(s->top==MAX-1)
	{	
		printf("栈满\n");
		return 0;
	}
	s->data[++s->top]=e;
	return 1;		
} 

//出栈
int pop(SqStack *s,int *e)
{
	if(s->top==-1)
	{
		printf("栈空\n");
		return 0;
	}
	*e=s->data[s->top--];
	return 1;		
} 

 

测试运行:

#include<stdio.h>
#include<stdlib.h>
 
#define MAX 10

typedef struct SqStack
{
	int data[MAX];
	int top;	
}SqStack;

//初始化栈 
void InitStack(SqStack *s)
{
	s->top=-1;
}

//判断栈是否为空 
int Stackempty(SqStack *s)
{
	if(s->top==-1)
		return 0;
	else
		return 1;	
} 

//进栈
int push(SqStack *s,int e)
{
	if(s->top==MAX-1)
	{	
		printf("栈满\n");
		return 0;
	}
	s->data[++s->top]=e;
	return 1;		
} 

//出栈
int pop(SqStack *s,int *e)
{
	if(s->top==-1)
	{
		printf("栈空\n");
		return 0;
	}
	*e=s->data[s->top--];
	return 1;		
} 

//打印栈元素
void printStack(SqStack *s)
{
    int topp = s->top;
	while(s->top!=-1)
	{
		printf("栈元素:%d\n",s->data[s->top--]);
	}
    s->top = topp;
} 
 
int main()
{
	int a;
	SqStack s;
	s={{1,2,3,4,5},4};    //赋值数组和栈顶指针
	push(&s,6); 
	pop(&s,&a);
	printf("出栈的元素是:%d\n",a);
	printStack(&s);
	return 0;
 } 

 

 

链栈

栈顶放在单链表头部,无需头结点,当链栈为空时top=NULL

链栈结构定义

typedef struct StackNode     //结点 
{
	int data;
	struct StackNode *next; 
}StackNode,*LinkStackPtr;

typedef struct Node
{
	LinkStackPtr top;
	int count;
}LinkStack;

 

基本操作

//进栈
int push(LinkStack *s,int e)
{
	LinkStackPtr p;  //插入p结点作为新栈顶 
	p=(LinkStackPtr)malloc(sizeof(StackNode));   //注意是用结点结构申请空间的 
	p->next=NULL;
	p->data=e;
	p->next=s->top;   //s->top为原栈顶 
	s->top=p;
	s->count++;
	return 1;		
} 

//出栈
int pop(LinkStack *s,int *e)
{
	LinkStackPtr p;    //定义一个变量存储需要删除的栈顶元素 
	if(!s)
	{
		printf("栈已空\n");
		return 0;
	}
	*e=s->top->data;
	p=s->top;
	s->top=s->top->next;
	free(p);
	s->count--;    
	return 1;	
} 

//判断是否为空
int Stackempty(LinkStack *s)
{
	if(s->top==NULL)
		return 0;
	else
		return 1;		
} 

//初始化链栈
void InitStack(LinkStack *s)
{
	 
	s=(LinkStack *)malloc(sizeof(LinkStack));   
	s->top=NULL;
} 

 

测试:

#include<stdio.h>
#include<stdlib.h> 


typedef struct StackNode     //结点 
{
	int data;
	struct StackNode *next; 
}StackNode,*LinkStackPtr;

typedef struct Node
{
	LinkStackPtr top;
	int count;
}LinkStack;


//进栈
int push(LinkStack *s,int e)
{
	LinkStackPtr p;  //插入p结点作为新栈顶 
	p=(LinkStackPtr)malloc(sizeof(StackNode));   //注意是用结点结构申请空间的 
	p->next=NULL;
	p->data=e;
	p->next=s->top;   //s->top为原栈顶 
	s->top=p;
	s->count++;
	return 1;		
} 

//出栈
int pop(LinkStack *s,int *e)
{
	LinkStackPtr p;    //定义一个变量存储需要删除的栈顶元素 
	if(!s)
	{
		printf("栈已空\n");
		return 0;
	}
	*e=s->top->data;
	p=s->top;
	s->top=s->top->next;
	free(p);
	s->count--;    
	return 1;	
} 

//判断是否为空
int Stackempty(LinkStack *s)
{
	if(s->top==NULL)
		return 0;
	else
		return 1;		
} 

//初始化链栈
void InitStack(LinkStack *s)
{
	 
	s=(LinkStack *)malloc(sizeof(LinkStack));   
	s->top=NULL;
} 

//打印栈元素
void printStack(LinkStack *s)
{
	while(s->top!=NULL)
	{
		printf("栈元素:%d\n",s->top->data);
		s->top=s->top->next;	
	}	
} 


int main()
{
	int a;
	LinkStack s;
	InitStack(&s);
	push(&s,1);
	push(&s,2);
	push(&s,3);
	push(&s,4);
	push(&s,5);
	pop(&s,&a);
	printStack(&s);
	return 0;
}

//为啥出问题了 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值