【数据结构】顺序栈与链栈

栈的特点是后进先出或先进后出,简称LIFO或FILO,通常top时刻表示栈顶的位置序号,一般空栈时top=-1;入栈栈顶指针加1,s->top++;出栈栈顶指针减1,s->top--

【顺序栈】

定义:

typedef struct
{
    int date[MAX];
    int top;
} SeqStack,*Stack;

置空栈:

 Stack Init_SeqStack()//置空栈 
{
    Stack s;
    s=(SeqStack*)malloc(sizeof(SeqStack));
    if(!s)
    {
        printf("空间不足\n");
        return NULL;
    }
    else
    {
        s->top = -1;
        return s;
    }
}

 判断是否为空栈:

int Empty_Stack(Stack s)//判断是否空栈 
{
    if (s->top == -1)
        return 1;
    else
        return 0;
}

进栈:

int Push_SeqStack(SeqStack* s,int x)//进栈 
{
    if (s->top == MAX - 1)
    {
        printf("栈满!");
        return 0;
    }
    else
    {
        s->top++;
        s->date[s->top] = x;
        return 1;
    }
}

出栈:

int Pop_SeqStack(SeqStack* s,int* x)//出栈  
{
    if (s->top == -1)
        return 0;
    else
    {
        *x = s->date[s->top];//(上面定义了一个指针,用指针来接受数据) 
        s->top--;
        return 1;
    }

}

 输出栈中元素:

int printStack(Stack s)//输出 
{
    int top = s->top;
    while (top != -1)
        printf("%4d", s->date[top--]);
    printf("\n");
    return 0;
}
int GetTop(Stack s)
{
    int top = s->top;
    return s->date[top];
}

输出栈顶: 

int GetTop(Stack s)
{
    int top = s->top;
    return s->date[top];
}

以下为一个顺序栈,实现栈的入栈、出栈并将其中元素输出功能

#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct
{int date[MAX];int top;
} SeqStack,*Stack; //SeqStack*==Stack
Stack Init_SeqStack()//置空栈 
{Stack s;s=(SeqStack*)malloc(sizeof(SeqStack));if(!s){printf("空间不足\n");return NULL;}else{s->top = -1;return s;}
}
int Empty_Stack(Stack s)//判断是否空栈 
{if (s->top == -1)return 1;elsereturn 0;
}
int Push_SeqStack(Stack s,int x)//进栈 
{if (s->top == MAX - 1){printf("栈满!");return 0;}else{s->top++;s->date[s->top] = x;return 1;}
}
int Pop_SeqStack(Stack s,int* x)//出栈  
{if (s->top == -1)return 0;else{*x = s->date[s->top];//(上面定义了一个指针,用指针来接受数据) s->top--;return 1;}}
int printStack(Stack s)//输出 
{int top = s->top;while (top != -1)printf("%4d", s->date[top--]);printf("\n");return 0;
}
int GetTop(Stack s)
{int top = s->top;return s->date[top];
}
int main()
{Stack s;int x;s=Init_SeqStack();Empty_Stack(s);printf("请输入入栈数字:\n");scanf("%d", &x);while (x != 0){Push_SeqStack(s,x);printf("请输入入栈数字:\n");scanf("%d", &x);}printStack(s);printf("栈顶:%d\n",GetTop(s));printf("出栈测试:");Pop_SeqStack(s,&x);//这个函数上面x定义的为指针,所以要加取地址符 printStack(s);return 0;
}

 【链栈】

定义:

typedef struct node
{
    int date;
    struct node* next;
}StackNode, * LinkStack;

实现链栈的入栈、出栈并将其中元素输出功能

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{int date;struct node* next;
}StackNode, * LinkStack;
void Init_LinkStack(LinkStack &p)//初始化 
{p = (LinkStack)malloc(sizeof(StackNode));p->date = 0;p->next = NULL;
}
int Empty_LinkStack(LinkStack top)
{if (top == NULL)return 1;elsereturn 0;
}
void Push_LinkStack(LinkStack &top, int x)//入栈 
{LinkStack s;s = (LinkStack)malloc(sizeof(StackNode));s->date = x;s->next = top->next;top->next = s;
}
LinkStack Pop_LinkStack(LinkStack &top, int &x)//出栈 
{LinkStack p;if (top->next == NULL)return NULL;else{p = top->next;x = p->date;top->next = p->next;free(p);return top;}
}
int GetTop(LinkStack s, int x)//栈顶
{if (s->next == NULL)return NULL;x = s->next->date;return x;
}void printStack(LinkStack top)//输出 
{while (top != NULL){printf("%4d", top->date);top = top->next;}printf("\n");
}
int main()
{LinkStack top;int x=0;Init_LinkStack(top);Empty_LinkStack(top);printf("请输入入栈元素:\n");scanf("%d", &x);while (x != 0){Push_LinkStack(top, x);printf("请输入入栈元素:\n");scanf("%d", &x);}printStack(top);printf("栈顶为:%d\n", GetTop(top, x));printf("出栈测试:\n");Pop_LinkStack(top, x);if (top != NULL){printStack(top);}elseprintf("栈空,无法输出!");return 0;
}

注意:链栈中的top是我所定义的一个指针,与顺序栈不同

求助:在链栈的代码中,输出栈中元素时,一直会在输出栈中元素的前端出现一个0(我在初始化函数中,将p->date赋初值为0),如何修改代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/238190.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux基础项目开发1:量产工具——文字系统(四)

前言&#xff1a; 前面我们已经把显示系统&#xff0c;输入系统的框架搭建好了&#xff0c;那么有了输入和显示&#xff0c;显示的内容应该是什么呢&#xff1f;这节就要让我们一起对显示的内容&#xff0c;文字系统进行搭建。 目录 一、数据结构抽象 1.描述一个文字的位图&a…

导入seaborn的数据集方法load_datasets的问题

sns.load_dataset使用报错解决URLError: &#xff1c;urlopen error [Errno 11004] getaddrinfo failed&#xff1e;&#xff08;windows&#xff09;&#xff09; import seaborn as sns import matplotlib.pyplot as plt ​ # 使用Seaborn自带的数据集 tips sns.load_datas…

力扣611题 有效三角形的个数 双指针算法

611. 有效三角形的个数 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例 1: 输⼊: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使⽤第⼀个 2) 2,3,4 (使⽤第⼆个 2) 2,2,3 ⽰例 2: 输⼊: nums [4,2,3,4] 输出: 4 解…

带你用uniapp从零开发一个仿小米商场_10.开发一个占剩余窗口的滚动区域

首先是一个头部的tag切换栏,这个很简单,就不多说 源码奉上 <scroll-view scroll-x class"border scroll-row" style"height: 80rpx;"><view class"scroll-row-item" style"height: 80rpx;line-height: 80rpx;" v-for"(…

使用MD5当做文件的唯一标识,这样安全么?

使用MD5作为文件唯一标识符可靠么&#xff1f; 文章目录 使用MD5作为文件唯一标识符可靠么&#xff1f;什么是MD5&#xff1f;MD5的用途MD5作为文件唯一标识的优劣优势劣势 使用MD5作为文件唯一标识的建议其他文件标识算法结束语 什么是MD5&#xff1f; MD5&#xff08;Messag…

CentOS或RHEL安装vscode

下载rpm安装包 网络下载或者下载到本地再上传到服务器&#xff0c;点击访问国内下载地址&#xff0c;不需要积分curl -fOL https://github.com/coder/code-server/releases/download/v4.19.1/code-server-4.19.1-amd64.rpm安装 rpm -i code-server-4.19.1-amd64.rpm关闭和禁用…

LORA概述: 大语言模型的低阶适应

LORA概述: 大语言模型的低阶适应 LORA: 大语言模型的低阶适应前言摘要论文十问实验RoBERTaDeBERTaGPT-2GPT-3 结论代码调用 LORA: 大语言模型的低阶适应 前言 LoRA的核心思想在于优化预训练语言模型的微调过程&#xff0c;通过有效地处理权重矩阵的变化&#xff08;即梯度更新…

SQL面试题,判断if的实战应用

有如下表&#xff0c;请对这张表显示那些学生的成绩为及格&#xff0c;那些为不及格 1、创建表&#xff0c;插入数据 CREATE TABLE chapter8 (id VARCHAR(255) NULL,name VARCHAR(255) NULL,class VARCHAR(255) NULL,score VARCHAR(255) NULL );INSERT INTO chapter8 (id, n…

从自动化、数字化到智能化,鸿蒙与制造业的双向奔赴

终端万物互联&#xff0c;商业竞争瞬息万变&#xff0c;制造企业面临着数字化转型与产品智能化升级的双重考验。鸿蒙操作系统以统一操作系统方案&#xff0c;可以为制造企业解决设备生态碎片化以及跨终端对接问题&#xff0c;提供安全性、流畅度、多屏协同等功能&#xff0c;实…

【紫光同创PCIE教程】——DMA读写/PIO内存读写TLP解析

本原创教程由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;http://www.meyesemi.com) 一&#xff1a;PIO内存读写操作TLP解析 PCIE有三种空间——内存空间、IO空间、配置空间&#xff0c;其中内存空…

支持Upsert、Kafka Connector、集成Airbyte,Milvus助力高效数据流处理

Milvus 已支持 Upsert、 Kafka Connector、Airbyte&#xff01; 在上周的文章中《登陆 Azure、发布新版本……Zilliz 昨夜今晨发生了什么&#xff1f;》&#xff0c;我们已经透露过 Milvus&#xff08;Zilliz Cloud&#xff09;为提高数据流处理效率&#xff0c; 先后支持了 Up…

选择排序,基础但你在面试很容易忽略的问题!

选择排序(Selection sort)是一种简单直观的排序算法。 第一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后再从剩余的未排序元素中寻找到最小&#xff08;大&#xff09;元素&#xff0c;然后放到…