数据结构-堆栈

1. 认识堆栈

  • 堆栈是一种特殊的数据结构,只在一端做输入、输出,即入栈、出栈
  • 特点:后入先出

对堆栈的基本操作如下

  • Stack CreateStack(int MaxSize) 建立一个空栈
  • int IsFull(Stack S,int MaxSize)判断该栈是否已满
  • void Push(Stack S,ElementType item)执行入栈操作,即将元素item压入栈中
  • int IsEmpty(Stack S)判断该栈是否为空
  • ElementType Pop(Stack S)执行出栈操作,即将栈顶元素移出栈

2. 堆栈的顺序存储实现

2.1 栈结构体类型

  • 栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量元素组成
  • 用数组表示堆栈时, top=-1表示栈为空 ;top=SIZE-1 表示栈满
typedef struct snode{
	int Data[SIZE];   //数组 
	int Top;          //栈顶元素位置 即数组元素下标 
}Stack; 

2.2 入栈操作

void Push(Stack *S,int item )   //入栈操作 
{   
    //先判断栈是否已满 
	if(S->Top==SIZE-1)
	{
	   printf("该栈已满\n");
	   return;
    }
    else
    {
    	S->Data[++(S->Top)]=item;    
    	return;
	}
}

2.3 出栈操作

int Pop(Stack* S)    //出栈操作 
{
	//判断是否为空栈 
	if(S->Top==-1)
	{
		printf("栈空\n"); 
		return ERROR;    //ERROR使用宏定义,同一个特殊的值来表示出栈失败
	}
	else
    	return S->Data[(S->Top)--];
} 

2.4 用一个数组表示两个堆栈

  • 方案:两个堆栈分别从数组的两头开始向中间生长;
  • 栈满标志:当两个栈的栈顶指针相遇时,即Top2 - Top1 = 1时,表示两个栈都满了

程序实现入栈出栈

//定义双堆栈结构类型 
typedef struct dsnote{
	int Data[SIZE];
	int Top1;
	int Top2;
}D_Stack; 
//入栈操作	
void D_Push(D_Stack *S,int item,int tag)
{
	if(S->Top2-S->Top1==1)  //检测堆栈是否已满 
	{ 
	   printf("该栈满\n");
	   return;
	}
	else
	{ 
	  if(tag==1)             //tag=1表示对对第一个栈进行入栈 
		S->Data[++(S->Top1)]=item;
	  if(tag==2)           tag=2表示对对第二个栈进行入栈  
		S->Data[--(S->Top2)]=item;	
      return;
    } 
} 
//出栈操作
int D_Pop(D_Stack *S,int tag)
{
	//对栈一进行操作 
	if(tag==1)        
	{
		if(S->Top1==-1)     //判断是否空 
		{
			printf("栈1空");
			return ERROR;
		}
		else
		    return S->Data[(S->Top1)--];
	}
	//对栈二进行操作 
	if(tag==2)
	{
		if(S->Top2==SIZE)  //判断是否空 
		{
			printf("栈2空");
			return ERROR;
		}
		else
		    return S->Data[(S->Top2)++];
	}
}

3.堆栈的链式存储实现

3.1栈结构体

typedef struct Snode {
	int Data;
	struct Snode *Next;
}Stack;

3.2 栈的操作

//创建一个空栈
Stack* Creat_Stack()  
{
   Stack *head=(Stack*)malloc(sizeof(Stack)); //创建头节点,返回头指针 
   head->Next=NULL;
   return head;
}
//判断是否为空
int IsEmpty_Stack(Stack*s)  
{
	if(s->next==NULL)
	 return 1;       //栈空返回1
	else 
	 return 0;
}
//入栈操作
void Push_Stack(Stack* s,int item)
{
	Stack* p=(Stack*)malloc(sizeof(Stack));
	p->Data=item;
	p->Next=s->Next;
	s->Next=p;
}
//出栈操作
int Pop_Stack(Stack* s) 
{   
    if(IsEmpty_Stack(s))
    {
    	printf("栈空\n");
    	return ERROR;
	}
	else
	{ 
	/*出栈操作涉及删除首节点,
	所以先定义指针指向首节点,以便后面free*/ 
		int num;
		Stack*p =s->Next;
		num=p->Data;
		s->Next=p->Next;
		free(p);
		return num;
	} 
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值