当前位置: 首页 > news >正文

【C++数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】

目录😋

任务描述

相关知识

1. 初始化栈

2. 销毁栈

3. 判断栈是否为空

4. 进栈(Push)

5. 出栈(Pop)

6. 取栈顶元素

测试说明

通关代码

测试结果


任务描述

本关任务:编写一个程序实现链栈的基本运算。

相关知识

为了完成本关任务,你需要掌握:

  1. 初始化栈
  2. 销毁栈
  3. 判断栈是否为空
  4. 进栈
  5. 出栈
  6. 取栈顶元素

1. 初始化栈

  • 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。
  • 示例(顺序栈)
    以下是一个简单的顺序栈初始化示例,假设用 C 语言实现,栈中存储整数,最大容量为MAX_SIZE
    #define MAX_SIZE 100
    int stack[MAX_SIZE];
    int top = - 1; 
    
    这里top初始化为 - 1,表示栈为空。当top - 1时,栈中没有元素。
  • 示例(链式栈)
    定义链式栈的节点结构:
    typedef struct StackNode {int data;struct StackNode *next;
    } StackNode;
    StackNode *top = NULL; 
    
    这里将栈顶指针top初始化为NULL,表示栈为空。当topNULL时,没有节点在栈中。

2. 销毁栈

  • 概念:销毁栈是释放栈占用的内存资源。对于顺序栈,如果栈是通过数组实现的,且数组是在栈的生命周期内自动分配的(如在函数内部定义的局部数组),一般不需要手动释放内存;但如果是动态分配的数组,需要使用free等函数释放。对于链式栈,需要逐个释放栈中的节点,避免内存泄漏。
  • 示例(顺序栈 - 动态分配情况)
    假设栈是通过动态分配的数组实现的,以下是销毁栈的示例:
    void destroyStack() {// 释放动态分配的数组内存free(stack);
    }
    
  • 示例(链式栈)
    以下是链式栈销毁的过程,需要遍历栈中的节点并释放它们:
    void destroyStack() {StackNode *current = top;StackNode *next;while (current!= NULL) {next = current - > next;free(current);current = next;}top = NULL;
    }
    

3. 判断栈是否为空

  • 概念:判断栈中是否有元素。对于顺序栈,通过检查栈顶指针(如top)是否为初始值来判断;对于链式栈,检查栈顶指针是否为NULL
  • 示例(顺序栈)
    可以通过以下方式判断顺序栈是否为空:
    int isEmpty() {return top == - 1;
    }
    
  • 示例(链式栈)
    对于链式栈,判断是否为空的函数如下:
    int isEmpty() {return top == NULL;
    }
    

4. 进栈(Push)

  • 概念:将元素添加到栈顶。对于顺序栈,需要先检查栈是否已满,然后将元素存入栈顶位置,并更新栈顶指针;对于链式栈,创建新节点,将元素存入新节点,然后将新节点插入到栈顶位置,更新栈顶指针。
  • 示例(顺序栈)
    以下是顺序栈进栈的操作示例:
    int push(int value) {if (top == MAX_SIZE - 1) {// 栈已满return 0;}top++;stack[top] = value;return 1;
    }
    
  • 示例(链式栈)
    链式栈进栈操作如下:
    int push(int value) {StackNode *newNode = (StackNode *)malloc(sizeof(StackNode));if (newNode == NULL) {// 内存分配失败return 0;}newNode - > data = value;newNode - > next = top;top = newNode;return 1;
    }
    

5. 出栈(Pop)

  • 概念:从栈顶移除元素。对于顺序栈,需要先检查栈是否为空,然后取出栈顶元素,更新栈顶指针;对于链式栈,取出栈顶节点的数据,释放栈顶节点,更新栈顶指针。
  • 示例(顺序栈)
    顺序栈出栈操作如下:
    int pop() {if (isEmpty()) {// 栈为空return - 1;}int value = stack[top];top--;return value;
    }
    
  • 示例(链式栈)
    链式栈出栈操作如下:
    int pop() {if (isEmpty()) {// 栈为空return - 1;}StackNode *temp = top;int value = top - > data;top = top - > next;free(temp);return value;
    }
    

6. 取栈顶元素

  • 概念:获取栈顶的元素,但不将其从栈中移除。对于顺序栈和链式栈,都需要先检查栈是否为空,然后返回栈顶元素的值。
  • 示例(顺序栈)
    顺序栈取栈顶元素操作如下:
    int peek() {if (isEmpty()) {// 栈为空return - 1;}return stack[top];
    }
    
  • 示例(链式栈)
    链式栈取栈顶元素操作如下:
    int peek() {if (isEmpty()) {// 栈为空return - 1;}return top - > data;
    }
    

测试说明

平台会对你编写的代码进行测试:

测试输入:

abcde

预期输出:

(1)初始化栈s
(2)栈为空
(3)依次进栈元素:a b c d e
(4)栈为非空
(5)出栈序列:e d c b a
(6)栈为空
(7)释放栈

测试输入:

xyz

预期输出:

(1)初始化栈s
(2)栈为空
(3)依次进栈元素:x y z
(4)栈为非空
(5)出栈序列:z y x
(6)栈为空
(7)释放栈

开始你的任务吧,祝你成功!


通关代码

// 请在Begin-End之间添加你的代码,
//实现链栈的如下基本运算,假设链栈的元素类型为char//
//(1)初始化栈s//
//(2)判断栈s是否非空,输出判断结果//
//(3)依次进栈元素,注:进栈元素由用户输入//
//(4)判断栈s是否非空,输出判断结果//
//(5)输出出栈序列//
//(6)判断栈s是否非空,输出判断结果//
//(7)释放栈//
/********** Begin *********/
#include <iostream>
using namespace std;struct Node{char data;Node *next;Node(char x): data(x),next(NULL){}
};class Stack{private:Node *top;public:Stack() : top(NULL){}~Stack(){while(top != NULL){Node *temp = top;top = top -> next;delete temp;}}bool isEmpty(){return top == NULL;}void push(char x){Node *newNode = new Node(x);newNode->next = top;top = newNode;}char pop(){if(isEmpty()){throw "Stack is empty";}char x = top->data;Node *temp = top;top  =top->next;delete temp;return x;}char peek(){if(isEmpty()){throw "Stack is empty";}return top->data;}
};int main(){string input;cin>>input;Stack s;cout <<"(1)初始化栈s"<<endl;if(s.isEmpty()){cout<<"(2)栈为空"<<endl;}cout <<"(3)依次进栈元素:";for(char c : input){s.push(c);cout <<c<<" ";}cout <<endl;if(!s.isEmpty()){cout <<"(4)栈为非空"<<endl;}cout <<"(5)出栈序列:";while (!s.isEmpty()){cout <<s.pop()<<" ";}cout <<endl;if(s.isEmpty()){cout<<"(6)栈为空"<<endl;}cout << "(7)释放栈"<<endl;return 0;
}/********** End **********/

测试结果

在这里插入图片描述


http://www.mrgr.cn/news/82857.html

相关文章:

  • 《Python趣味编程》专栏介绍与专栏目录
  • 多行输入模式(dquote> 提示符)double quote(双引号)
  • 如何在工作中保持稳定的情绪?
  • 移动端开发:响应式设计与适配技巧
  • TCP 如何获取端口信息
  • Python应用——将Matplotlib图形嵌入Tkinter窗口
  • 从 TiDB 学习分布式数据库测试
  • 大模型搜索引擎增强问答demo-纯python实现
  • Linux应用软件编程--网络通信(传输层:udp协议,tcp协议,应用层:http协议)
  • nlp培训重点-2
  • Kali系统(Debian 10.3) 遇到的问题
  • 【ROS2】☆ launch之Python
  • 云商城--业务+架构学习和环境准备
  • 【Transformer】小白入门指南
  • 【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
  • 【C语言程序设计——选择结构程序设计】求输入的日期是该年的第几天(头歌实践教学平台习题)【合集】
  • 【C语言程序设计——循环程序设计】利用循环求数值 x 的平方根(头歌实践教学平台习题)【合集】
  • 【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】
  • 每天看一个Fortran文件(9)
  • 【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
  • 【什么是MVCC?】
  • 【stm32+K210项目】基于K210与STM32协同工作的智能垃圾分类系统设计与实现(完整工程资料源码)
  • 51c自动驾驶~合集45
  • 【C++数据结构——图】图的遍历(头歌教学实验平台习题) 【合集】
  • 【C语言程序设计——循环程序设计】求解最大公约数(头歌实践教学平台习题)【合集】
  • 【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】