数据结构--栈代码(王道书上代码手敲!!!)c++

目录

1.栈(顺序存储)初始化,判空,判满,入栈,出栈,读栈顶元素,遍历输出操作

2.栈(链式)


注意!!!以下代码是在c++环境中写的c代码,用了c++代码的&

1.栈(顺序存储)初始化,判空,判满,入栈,出栈,读栈顶元素,遍历输出操作

代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MaxSize 10		//定义栈中元素的最大个数

//栈的顺序存储
//定义结构体
typedef struct {
	int data[MaxSize];	//静态数组存放栈中元素
	int top;			//栈顶指针
}SqStack;

//初始化
bool InitStack(SqStack &S) {
	S.top = -1;			//初始化栈顶指针
	return  true;
}

//判断栈是否为空
bool Empty(SqStack S) {
	if (S.top == -1)
		return true;
	else
		return false;
}

//判断栈是否满
bool FUll(SqStack S) {
	if (S.top == MaxSize - 1)
		return true;
	else
		return false;
}

//入栈,增加元素
bool Push(SqStack &S,int x) {
	if (S.top==MaxSize-1) {	//若栈满
		return false;
	}
	S.data[S.top + 1] = x;
	S.top = S.top + 1;
	//上面的两行代码等价于这句	S.data[++S.top]=x;	表示先对S.top的值加一,再使用他的值
	return true;
}

//出栈,删除元素
bool Pop(SqStack &S,int &x) {
	if (S.top == -1)		//若栈空
		return false;
	x =S.data[S.top];	//要删除的元素的数据保存到x里
	S.top--;
	//上面两行代码等价于 x=S.data[S.top--];
	return true;
}

//读取栈顶元素的值
int GetTop(SqStack S){
	if (S.top == -1)		//若栈空
		return -1;
	int x;	//用来存储栈顶元素的值
	x = S.data[S.top];
	return x;
}

//遍历打印栈内元素
void PrintStack(SqStack S) {
	int tempTop = S.top;   // 使用临时变量来遍历栈
	while (tempTop != -1) {
		printf("%d\n", S.data[tempTop]);
		tempTop--;
	}
}

int main() {
	SqStack S;		//声明一个顺序栈,分配空间
	InitStack(S);

	//验证判空操作
	printf("栈是否为空:%s\n",Empty(S)?"是":"否");
	printf("top值:%d\n",S.top);
	//在栈内添加元素
	Push(S, 1);
	Push(S, 2);
	Push(S, 3);
	printf("当前栈内的元素为:\n");
	PrintStack(S);
	//删除栈内元素
	int x;
	Pop(S, x);
	printf("删除的元素为:%d\n",x );
	Pop(S, x);
	printf("删除的元素为:%d\n", x);
	//读取栈顶元素
	x=GetTop(S);
	printf("栈顶元素为:%d\n", x);
	return 0;
}

结果:

2.栈(链式)

代码:

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

//带头结点的链式存储的栈
//定义结构体
typedef struct LinkNode{
	int data;
	struct	LinkNode *next;		//下一个节点的指针
}SNode,*LinkStack;

//初始化链式栈
bool InitStack(LinkStack &S) {
	S = (SNode*)malloc(sizeof(LinkNode));
	if (S==NULL)			//内存分配失败
		return false;
	S->next == NULL;		//将指向下一个节点指针清空
	return true;
}

//进栈(增加元素)  
/// <summary>
/// 将元素压入链式栈中。
/// </summary>
/// <param name="S">指向栈的指针</param>
/// <param name="value">要压入栈的整数值</param>
/// <returns>如果操作成功,返回 true;否则返回 false。</returns>
bool Push(LinkStack &S, int value) {
	LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));
	if (p == NULL||S==NULL)
		return false;	//内存分配失败
	p->data = value;	//设置新节点的数据
	p->next = S->next;	//新节点得下一个指针指向当前栈顶元素
	S->next = p;		//更新栈顶指针指向新节点
	return true;
 }

//出栈
bool Pop(LinkStack S,int &x) {
	if (S == NULL|| S->next==NULL)
		return false;			//若栈空
	LinkNode* p = S->next;		//指向栈顶元素
	x = p->data;				//取出栈顶元素得数据
	S->next=p->next;			//更新头节点的next指针
	free(p);					//释放栈顶节点
	return true;
}

//查,获取栈顶元素,peek窥视
bool Peek(LinkStack S,int &x) {
	if (S == NULL || S->next == NULL)
		return false;			//若栈空
	x = (S->next)->data;		//获取栈顶元素
	return true;
}

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

//判满
//判满:在链式栈中不需要判满,因为链栈是动态的,只受限于系统内存。

int  main() {
    LinkStack S;
    int x;

    // 初始化栈
    if (InitStack(S)) {
        printf("栈初始化成功!\n");
    }
    else {
        printf("栈初始化失败!\n");
        return -1;
    }

    // 判断栈是否为空
    if (Empty(S)) {
        printf("栈为空!\n");
    }
    else {
        printf("栈不为空!\n");
    }

    // 压栈操作
    if (Push(S, 10)) {
        printf("元素 10 压入栈成功!\n");
    }
    else {
        printf("元素 10 压入栈失败!\n");
    }

    if (Push(S, 20)) {
        printf("元素 20 压入栈成功!\n");
    }
    else {
        printf("元素 20 压入栈失败!\n");
    }

    if (Push(S, 30)) {
        printf("元素 30 压入栈成功!\n");
    }
    else {
        printf("元素 30 压入栈失败!\n");
    }

    // 获取栈顶元素
    if (Peek(S, x)) {
        printf("当前栈顶元素为: %d\n", x);
    }
    else {
        printf("获取栈顶元素失败!\n");
    }

    // 出栈操作
    if (Pop(S, x)) {
        printf("出栈成功,出栈元素为: %d\n", x);
    }
    else {
        printf("出栈失败!\n");
    }

    // 再次获取栈顶元素
    if (Peek(S, x)) {
        printf("当前栈顶元素为: %d\n", x);
    }
    else {
        printf("获取栈顶元素失败!\n");
    }

    // 判断栈是否为空
    if (Empty(S)) {
        printf("栈为空!\n");
    }
    else {
        printf("栈不为空!\n");
    }

    // 再次出栈操作
    if (Pop(S, x)) {
        printf("出栈成功,出栈元素为: %d\n", x);
    }
    else {
        printf("出栈失败!\n");
    }

    // 再次判断栈是否为空
    if (Empty(S)) {
        printf("栈为空!\n");
    }
    else {
        printf("栈不为空!\n");
    }
}


结果:


结束啦~

觉得有用的友友帮忙点个赞呀~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值