C语言数据结构--栈 基本操作代码合集

概述

三段代码分别是栈的顺序存储,带头结点的链式存储,不带头结点的链式存储。

都包括着初始化、判空、进栈、建立栈表、出栈,读取栈顶元素、遍历操作,方便大家调试。

顺序存储

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 50
typedef struct{            //栈的顺序存储类型 
    int data[MaxSize];      //存放栈中元素 
    int top;               //栈顶指针 
}SqStack;

void InitStack(SqStack &S)
{
	S.top = -1;              //初始化栈顶指针 
 } 
 
bool StackEmpty(SqStack S)  //判空操作 
 {
 	if(S.top == -1)
 	  return true;
 	else
 	  return false;
  } 
  
bool Push(SqStack &S,int x)   //进栈 
 {
 	if(S.top == MaxSize-1)    //栈满报错 
 	   return false; 
 	S.data[++S.top] = x;     //注意入栈是指针先加一,再入栈 
 	return true;
  } 
  
SqStack CreateStack(SqStack &S)
 {
 	int x = 0;
 	scanf("%d",&x);
 	while(x!=9999)
 	{
 		Push(S,x);         //调用进栈函数 
 		scanf("%d",&x);
	 }
	 return S;
 }
 
bool Pop(SqStack &S,int &x)  //出栈 
{
	if(S.top == -1)      //栈空报错 
	  return false;
	x=S.data[S.top--];
	printf("出栈元素为:%d\n",x);
	return true; 
 } 
 
bool GetTop(SqStack S,int &x)   //读取栈顶元素 
 {
 	if(S.top == -1)
 	  return false;
 	x=S.data[S.top];
 	return true;
  } 
  
void Print(SqStack S)                   //遍历 
{
	while(S.top != -1)
	{
		printf("%d ",S.data[S.top--]);
	}
}

int main()
  {
  	int x = 0;
  	SqStack S;
  	InitStack(S);
  	CreateStack(S);           //创建栈 
  	Push(S,666);               //再进一个元素 
  	Pop(S,x);                  //出栈,并用x返回栈顶元素 
  	Print(S);
  	return 0;
   } 
  

带头结点的链式存储

#include<stdio.h>
#include<stdlib.h>
typedef struct StackNode{
	int data;
	struct StackNode *next;
}StackNode,*LiStack;

void InitStack(LiStack &S)        //带头结点的链栈初始化 
{
	S=(StackNode *)malloc(sizeof(StackNode));
	S->next=NULL;
 } 

bool StackEmpty(LiStack S)     //判空 
{
	if(S->next==NULL)
	  return true;
	else
	  return false;
 } 

bool Push(LiStack &S,int x)   //进栈 
 {
 	StackNode *p=S;
 	StackNode *o;
 	o=(StackNode *)malloc(sizeof(StackNode));
 	o->data = x;
 	o->next = p->next ;
 	p->next = o;
 	return true;
 }

LiStack CreateStack(LiStack &S)   //调用Push函数建立链栈 
 {
 	int x = 0;
 	scanf("%d",&x); 
 	while(x!=9999)
 	{
 	    Push(S,x);
 		scanf("%d",&x);
	 }
	 return S;
 }

bool Pop(LiStack &S,int &x)    //出栈 ,用x返回出栈的值  
 {
 	StackNode *p = S;
 	if(p->next ==NULL)
 	 return false;
 	StackNode *D = p->next ;
 	x = D->data ;
 	p->next =D->next ;
 	free(D);
 	 return true;
 }

bool GetTop(LiStack S,int &x)   //读取栈顶元素,并用x返回其值
 {
 	StackNode *p=S;
 	if(p->next == NULL)
	 return false;
	x=p->next->data ;
	printf("栈顶元素X=%d\n",x);
	return true; 
  } 

void Print(LiStack S)            //遍历 
 {
 	StackNode *p = S->next;
 	while(p!=NULL)
 	{
 		printf("%d ",p->data);
 		p=p->next ;
	 }
 }


int main()
 {
 	
 	int x = 0;
 	LiStack S;                     //声明 
 	InitStack(S);                 //初始化 
	CreateStack(S);               //创建 
      // Push(S,666);             //进栈 
     // Pop(S,x);                //出栈 
	GetTop(S,x);                 //读取栈顶元素 
	Print(S);
 	
 	return 0;
 }

不带头结点的链式存储

#include<stdio.h>
#include<stdlib.h>
typedef struct StackNode{            
	int data;
	struct StackNode *next;
}StackNode,*LiStack; 

void InitStack(LiStack &S)              //初始化不带头结点的链栈 
{
	S=NULL;
}

bool StackEmpty(LiStack S)               //判空 
{
	if(S==NULL)
	  return true;
	else
	  return false;
 } 

bool Push(LiStack &S,int x)                //进栈 
{
		StackNode *N;
		N=(StackNode *)malloc(sizeof(StackNode));
	    N->data = x;
	    N->next = S;                       //注意这里头插法方式的不同之处 
	    S = N;
		return true;
}

LiStack CreateStack(LiStack &S)         //创建栈 
{
	int x = 0;
	printf("请输入入栈函数:");
	scanf("%d",&x);
	while(x!=9999)
	{
		Push(S,x);
		scanf("%d",&x);
	}
	return S;              
 } 
 
bool Pop(LiStack &S,int &x)          //出栈 
{
	if(S==NULL)
	  return false;
	StackNode *p=S;    
	x=p->data ;
	S=p->next ;
	free(p);
	return true; 
}

bool GetTop(LiStack S,int &x)          //读取栈顶元素 
{
	if(S==NULL)
	  return false;
	x=S->data ;
	printf("栈顶元素为:%d \n",x);
	return true;
}

void Print(LiStack S)               //遍历 
{
	while(S!=NULL)
	{
		printf("%d ",S->data);
		S=S->next ;
	}
}

int main()
{
	int x = 0;
	LiStack S; 
	InitStack(S);  
    CreateStack(S);
   // Push(S,666);
    //Pop(S,x);
    GetTop(S,x);
    Print(S);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值