栈的实现以及相关操作

本文介绍了如何使用顺序表和链表来实现栈的两种常见数据结构。对于顺序栈,提供了初始化、判空、判满、入栈、出栈和查看栈顶元素的函数。链栈部分则展示了带头节点和不带头节点的链栈实现,同样包含入栈、出栈和获取栈顶元素的操作。代码实例展示了如何在C++中实现这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 一、用顺序表实现的顺序栈

#include<iostream>
#include<cstdio>
using namespace std;


//栈的相关操作以及实现,包括初始化、判空、判满、增(push)、删(pop)、查(getpop);栈不涉及“改”的问题。

//栈的的数据结构的定义

#define MaxSize 100
typedef struct{
    //顺序栈
    int data[MaxSize];  
    int top;
}SqStack;


void InitStack(SqStack &S){
    //栈的初始化
    S.top = -1;  //注意在这里是让栈顶指针指向当前数据的上一个地址
}

bool IsEmpty(SqStack S){
    //判断栈是否为空
    return S.top == -1;
}

bool IsFull(SqStack S){
    return S.top == MaxSize-1;
}

bool Push(SqStack &S,int x){
    //入栈操作
    
    //栈满不可以插入元素
    if(IsFull(S))
        return false;
    
    S.data[++S.top] = x;
    return true;
}

bool Pop(SqStack &S, int &x){
    //出栈操作
    
    //判断栈是否为空
    if(IsEmpty(S))
        return false;
    
    x = S.data[S.top--];
    return true;
}

bool GetPop(SqStack S,int &x){
    if(IsEmpty(S))
        return false;
    x = S.data[S.top];
    return true;
}


int main(){
    //用来测试以上函数是否可以正确运行
    SqStack S;
    int x;
    InitStack(S);
    for(int i = 0;  i < 5; i++){
        Push(S,i);
    }
    while(Pop(S,x)){
        printf("%d ",x);
    }
    return 0;
}


 

用链表实现的链栈 

1,带头节点的链栈

#include<iostream>
#include<cstdio>
using namespace std;


//用链表实现的链栈(带头节点)

//基本的数据定义
typedef struct LinkNode{
	int data;
	struct LinkNode *next;
}*LiStack;

LiStack L = (LiStack)malloc(sizeof(LiStack));

//链栈的初始化
void InitLiStack(LiStack &S){
	LiStack L = (LiStack)malloc(sizeof(LiStack));
	L->next = NULL;
}

//无需判空和判满

//增加元素
bool Push(LiStack &S,int x){
	LiStack p = (LiStack)malloc(sizeof(LiStack));
	
	//内存空间不足
	if(p == NULL)
		return false;
	
	p->data = x;
	p->next = L->next;
	L->next = p;
	return true;
}

//删除元素
bool Pop(LiStack S,int &x){
	if(L->next == NULL){
		//链栈空
		return false;
	}
	
	x = L->next->data;
	L->next = L->next->next;
	return true;
}

//得到栈顶元素
bool GetTop(LiStack S,int x){
	
	//栈空
	if(L->next ==NULL)
		return false;
	
	x = L->next->data;
	return true;
}

int main(){
	//Test
	LiStack S;
	int x;
	InitLiStack(S);
	for(int i= 1; i < 5; i++){
		Push(S,i);
	}
	while(L->next != NULL){
		Pop(S,x);
		printf("%d ",x);
	}
	return 0;
}

2.不带头节点的链栈

#include<iostream>
#include<cstdio>
using namespace std;


//用链表实现的链栈(不带头节点)

//基本的数据定义
typedef struct LinkNode{
	int data;
	struct LinkNode *next;
}*LiStack;

LiStack L;


//链栈的初始化
void InitLiStack(LiStack &S){
	L = NULL;
}

bool Push(LiStack &S,int x){
	LiStack p = (LiStack)malloc(sizeof(LiStack));
	
	//内存分配失败
	if(p == NULL)
		return false;
	
	p->data = x;
	//如果插入的是第一个节点,需要将next指针置空
	if(L == NULL){
		p->next = NULL;
	}
	
	p->next = L;
	L = p;
	return true;
}


//链栈的Pop操作
bool Pop(LiStack &S,int &x){
	//出栈需要释放节点
	
	LiStack p;
	//如果链栈为空,则栈为空
	if(L == NULL)
		return false;
	
	p = L;
	x = p->data;
	L = p->next;
	free(p);
	return true;
}
//获得栈顶元素
bool GetPop(LiStack S,int &x){
	if(L == NULL)
		return false;
	x = L->data;
	return true;
}


int main(){
	//测试使用
	
	LiStack S;
	int x;
	InitLiStack(S);
	
	for(int i =1; i < 10; i++){
		x = random()%1000;
		printf("%d\n",x);
		Push(S,x);
	}
	while(Pop(S,x)){
		printf("%d ",x);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值