栈的定义和基本操作的实现

news2024/12/23 8:57:51

写代码:定义顺序存储的栈(数组实现),数据元素是 int 型 
写代码:基于上述定义,实现“出栈、入栈、判空、判满”四个基本操作 
写代码:定义链式存储的栈(单链表实现) 
写代码:基于上述定义,栈顶在链头,实现“出栈、入栈、判空、判满”四个基本操作 
写代码:定义链式存储的栈(双向链表实现) 
写代码:基于上述定义,栈顶在链尾,实现“出栈、入栈、判空、判满”四个基本操作 
给自己出题:自己动手创造,写一个具有多层小括号、中括号的算数表达式 
画图:针对2.1.7的算数表达式,使用栈进行“括号匹配”,画出栈内元素最多的状态 
简答:请描述使用栈进行括号匹配的过程 

 1.定义顺序存储的栈(数组实现),数据元素是 int 型 

#include <stdio.h>

#define Maxsize 50

typedef struct{
	int data[Maxsize];
	int top;
}sqStack;


2.实现“出栈、入栈、判空、判满”四个基本操作 

#include <stdio.h>

#define Maxsize 50

typedef struct{
	int data[Maxsize];
	int top;
}sqStack;

//初始化
void InitStack(sqStack *s){
	s->top=-1;
} 
//判空
bool  StackEmpty(sqStack &s)
{
	if(s.top==-1)
		return true;
	else
		return false;
	
}
//判满
bool StackFull(sqStack s)
{
	if(s.top==Maxsize-1){
		//TODO
		return true;
		
	}else{
		return false;
	}
}
//入栈
bool Push (sqStack &s,int e){
	if(s.top==Maxsize-1){
		//TODO
		return false;
	}
	s.data[++s.top]=e;
	return true;
} 
//出栈
bool Pop(sqStack &s,int e){
	if(s.top==-1){
		//TODO
		return false;
	}
	e=s.data[s.top--];
	return true;
} 
// 打印栈内元素
void printStack(sqStack &s) {
    if (StackEmpty(s)) {
        printf("栈为空\n");
        return;
    }
    for (int i = s.top; i >= 0; i--) {
        printf("%d ", s.data[i]);
    }
    printf("\n");
}
 
int main() {
    sqStack s;
    InitStack(&s);
 
    // 示例操作
    Push(s, 1);
    Push(s, 2);
    Push(s, 3);
    printStack(s);
 
    int value = Pop( s,3);
    printf("出栈元素: %d\n", value);
    printStack(s);
 
    return 0;
}


3.定义链式存储的栈(单链表实现) 

        

#include <stdio.h>

typedef struct Linknode
{
	int data;
	struct Linknode *next;
}Linknode;
typedef struct Stack
{
	Linknode *top;
	
}Stack;


4.栈顶在链头,实现“出栈、入栈、判空、判满”四个基本操作 

#include <stdio.h>
#include <stdlib.h>
typedef struct Linknode
{
	int data;
	struct Linknode *next;
}Linknode;
typedef struct Stack
{
	Linknode *top;
	int size;
	int maxSize;
	
}Stack;

//初始化
void initStack(Stack *stack,int maxSize)
{
	stack->top=NULL;
	stack->maxSize=maxSize;
	stack->size=0;
	


}

//判空
bool stackEmpty(Stack stack)
{
	if(stack.top==NULL){
		//TODO
		return true;
		
	}else{
		return false;
	}
} 

//判满
bool stackFull(Stack *stack)
{
	if(stack->size =stack->maxSize){
		return true;
	} 
	else{
		return false;
	}
	    
}
//入栈
void push(Stack *stack ,int data)
{
	Linknode *newNode=(Linknode*)malloc(sizeof(Linknode));
	newNode->data=data;
	newNode->next=stack->top;//新节点指向旧的栈顶
	stack->top=	newNode;//更新栈顶指针
	 
} 
//出栈
bool pop(Stack *stack)
{
	if(stackEmpty(*stack)){
		//TODO
		printf("栈已空,无法进行出栈操作。\n");
		return false;
	}
	Linknode*temp=stack->top;
	int data=stack->top->data;
	stack->top=stack->top->next;//更新栈顶指针
	free(temp) ;
	return true ;
	
} 

void printStack(Stack stack) {
    Linknode* current = stack.top;
    while (current != NULL) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}
 
int main() {
    Stack stack;
    initStack(&stack,50);
 
    push(&stack, 1);
    push(&stack, 2);
    push(&stack, 3);
 
    printStack(stack); // 输出: 3 2 1
 
    int popped = pop(&stack);
    printf("出栈元素: %d\n", popped);
 
    printStack(stack); // 输出: 2 1
 
    return 0;
}


5.定义链式存储的栈(双向链表实现) 

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

struct Node {
    int data;
    struct Node* next;
    struct Node* prev;
};

// 定义栈结构
struct Stack {
    struct Node* top; // 栈顶指针,链尾
};


6.基于上述定义,栈顶在链尾,实现“出栈、入栈、判空、判满”四个基本操作 

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

struct Node {
    int data;
    struct Node* next;
    struct Node* prev;
};

// 定义栈结构
struct Stack {
    struct Node* top; // 栈顶指针,链尾
};

// 初始化
void initStack(struct Stack* stack) {
    stack->top = NULL;
}

// 入栈
void push(struct Stack* stack, int value) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    if (newNode == NULL) {
        printf("内存分配失败,无法执行入栈操作\n");
        return;
    }
    newNode->data = value;
    newNode->next = NULL;

    if (stack->top == NULL) {
        newNode->prev = NULL;
        stack->top = newNode;
    } else {
        newNode->prev = stack->top;
        stack->top->next = newNode;
        stack->top = newNode;
    }
}

// 出栈
int pop(struct Stack* stack) {
    if (stack->top == NULL) {
        printf("栈为空,无法执行出栈操作\n");
        return -1; // 返回一个错误值
    }
    struct Node* temp = stack->top;
    int poppedValue = temp->data;

    if (stack->top->prev != NULL) {
        stack->top = stack->top->prev;
        stack->top->next = NULL;
    } else {
        stack->top = NULL;
    }

    free(temp);
    return poppedValue;
}

// 判空
int isEmpty(struct Stack* stack) {
    return (stack->top == NULL);
}

// 判满
//对于链式存储的栈,通常不会满,所以返回0表示不满
int isFull(struct Stack* stack) {
    return 0;
}

void freeStack(struct Stack* stack) {
    while (stack->top != NULL) {
        struct Node* temp = stack->top;
        stack->top = temp->prev;
        free(temp);
    }
}

int main() {
    struct Stack stack;
    initStack(&stack);
    push(&stack, 1);
    push(&stack, 2);
    push(&stack, 3);

    printf("出栈操作: %d\n", pop(&stack));

    printf("栈是否为空: %s\n", isEmpty(&stack) ? "是" : "否");

    printf("栈是否满: %s\n", isFull(&stack) ? "是" : "否");

    freeStack(&stack);

    return 0;
}


7.一个具有多层小括号、中括号的算数表达式 


8.画图:针对2.1.7的算数表达式,使用栈进行“括号匹配”,画出栈内元素最多的状态 

 


9.简答:请描述使用栈进行括号匹配的过程 

扩展:

中缀表达式转后缀表达式

中缀表达式转前缀表达式

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零钱兑换二维dp实现(力扣--动态规划)

文章目录 1.题目描述2.解题思路3.代码实现 1.题目描述 题目链接&#xff1a;零钱兑换 2.解题思路 1.确定二维dp[i][j]的含义&#xff1a; dp[i][j] 前i个物品任取&#xff0c;装入容量为j的背包种&#xff0c;最少的硬币个数是dp[i][j] 2.确定递推公式&#xff1a; dp[i][j]…

【日语学习必备】5款超准实时翻译软件,让你的网课不再有障碍!

日语水平不过关&#xff0c;没办法实时听懂日语会议或日语网课内容怎么办&#xff1f; 两种方法&#xff01; 一、利用日语实时翻译软件&#xff0c;也就是所谓同声传译的方式实时将日语转换为中文 二、先将会议或网课等内容录制下来&#xff0c;再借助语音或视频翻译软件&am…

利士策分享,探索无界:心灵之旅,发现未知精彩

利士策分享&#xff0c;探索无界&#xff1a;心灵之旅&#xff0c;发现未知精彩 梦想的种子&#xff0c;在心田生根发芽 正如每一颗种子都蕴含着生命的奥秘&#xff0c;每个人心中那颗探索的种子&#xff0c;也藏着对未知世界的渴望与追求。它告诉我们&#xff0c;成长不仅仅…

Unite Shanghai 2024 技术专场 | Unity 6及未来规划:Unity引擎和服务路线图

在 2024 年 7 月 24 日的 Unite Shanghai 2024 技术专场演讲中&#xff0c;Unity 高级技术产品经理 Jeff Riesenmy 带来演讲 Unity 6 and Beyond: A Roadmap of Unity Engine and Services。作为本次 Unite 首场专题演讲&#xff0c;他介绍了 Unity 引擎的最新进展及其配套的工…

猫头虎分享:15种数码苹果16抢购攻略

猫头虎分享&#xff1a;15种数码苹果16抢购攻略 大家好&#xff0c;我是猫头虎&#xff01;今晚8点&#xff0c;就是大家期待已久的苹果16抢购时刻&#xff0c;你准备好了吗&#xff1f;为了帮助大家顺利抢到心仪的机型&#xff0c;我精心准备了15种抢购指南&#xff0c;总有一…

[C#学习笔记]LINQ

视频地址&#xff1a;LINQ入门示例及新手常犯的错误_哔哩哔哩_bilibili 强烈推荐学习C#和WPF的朋友关注此UP&#xff0c;知识点巨多&#xff0c;讲解透彻&#xff01; 一、基本概念 语言集成查询(Language-Intergrated Query) 常见用途 .Net原生集合(List&#xff0c;Arra…

“勇者斗恶龙”即将上演,乐道L60剑指Model Y

文/王俣祺 导语&#xff1a;只要说到“二十多万”“大品牌”“纯电SUV”这一系列关键词&#xff0c;特斯拉Model Y一定是绕不开的车型&#xff0c;从近几年的销量来看&#xff0c;目前市面上很难有车型能“硬刚”。不过既然有“恶龙”就会有“勇者”&#xff0c;蔚来子品牌乐道…

“薅羊毛”时间到, 容声以旧换新“钜惠”升级

9月13日&#xff0c;由佛山市商务局、顺德区人民政府指导&#xff0c;海信家电集团主办的以旧换新佛山发布活动启幕。 海信家电&#xff08;SZ 000921&#xff0c;HK 00921&#xff09;旗下容声冰箱叠加国家以旧换新补贴&#xff0c;把“以旧换新”升级到“品质换新”&#xf…

汤臣倍健业绩大幅下滑:经销商减少131家,销售费用转化不达预期

《港湾商业观察》廖紫雯 在膳食营养补充剂&#xff08;VDS&#xff09;行业竞争加剧的情况下&#xff0c;日前&#xff0c;汤臣倍健股份有限公司&#xff08;以下简称&#xff1a;汤臣倍健&#xff0c;300146.SZ&#xff09;披露2024年半年报业绩情况。上半年&#xff0c;公司…

爱普生相机SD卡格式化后数据恢复指南

我借了朋友的‌爱普生相机&#xff0c;想查看一下内存&#xff0c;哎呀&#xff0c;一不小心按错了&#xff0c;竟然执行了格式化操作&#xff0c;这可真是太让人郁闷了&#xff0c;这还有机会挽救数据吗&#xff1f;心塞&#xff0c;求帮助&#xff01; 随着数码摄影的普及&am…

GUI编程10:窗口监听事件

视频链接&#xff1a;12、窗口监听事件_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p12&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.使用成员内部类方式实现窗口监听 ackage com.yundait.lesson03;import java.awt.*; import java.awt.event.Win…

学习之git的团队协作

git团队协作 一 团队内协作 生成SSH公钥私钥 一&#xff08;跨团队协作&#xff09;

java的ReentrantLock原理

示例代码如下&#xff0c;主要包括两个方法&#xff1a; public static void main(String[] args) throws InterruptedException {Lock lock new ReentrantLock();lock.lock();lock.unlock();}双向链表初始状态&#xff1a; 双向链表从尾节点添加阻塞的节点&#xff1a; 读源…

WebLogic 笔记汇总

WebLogic 笔记汇总 一、weblogic安装 1、创建用户和用户组 groupadd weblogicuseradd -g weblogic weblogic # 添加用户,并用-g参数来制定 web用户组passwd weblogic # passwd命令修改密码# 在文件末尾增加以下内容 cat >>/etc/security/limits.conf<<EOF web…

小程序开发设计-第一个小程序:注册小程序开发账号②

注册小程序开发账号整体流程&#xff1a; 1.点击注册按钮&#xff1a; 使用浏览器打开微信公众平台网址&#xff0c;点击右上角的“立即注册”即可进入到小程序开发账号的注册流程&#xff0c;主要流程截图如下&#xff1a; 2.选择注册账号的类型&#xff1a; 3.填好账号信息&…

天空卫士项目荣获“2024 IDC 中国20大杰出安全项目 ”奖项 ,实力见证安全守护

9月11日&#xff0c; IDC在上海圆满举办安全风险管控峰会&#xff0c;并现场官宣“2024 IDC中国20大杰出安全项目(CSO20) ”和“2024 IDC中国 CSO名人堂 (十大人物) ” 奖项名单。联通软研院申报的联通邮件系统安全合规建设项目被评为“2024 IDC中国20大杰出安全项目(CSO20) ”…

【Qt 编程入门】如何用 Qt 实现一个基本的计算器

前言 QT中实现一个简单的计算器是一个比较好的练手项目&#xff0c;下面是源码&#xff1a; Calculator计算器 设计界面 待实现的界面主要包含两个部分&#xff1a; 输入输出栏用户点击的按钮 输入输出栏通过QLabel类实现&#xff0c;而用户点击按钮通过QPushButton或QToo…

3分钟带你快速了解 Java 接口

我醉欲眠卿且去 明朝有意抱琴来 目录 接口的概念 定义接口 接口格式 接口的特性 &#xff08;1&#xff09;接口不能直接创建对象 &#xff08;2&#xff09;接口不能用 final 修饰 &#xff08;3&#xff09;接口中定义的变量 &#xff08;4&#xff09;接口中定义的方法 接…

Visual Studio Installer 2022 安装提示正在提取文件 进度条不动 0B每秒

Visual Studio Installer 稍等片刻...正在提取文件 进度条不动 0B每秒 一段时间后提示 循环下载安装文件 无法下载安装文件。请检查Internet 连接&#xff0c;然后重试 打开vs2017 或者vs2019或者vs2022的安装程序(visual studio installer)时&#xff0c;下载进度条不动&…

【C++】认识C++(前言)

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:C_小米里的大麦的博客-CSDN博客 &#x1f381;代码托管:C: 探索C编程精髓&#xff0c;打造高效代码仓库 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、本节概述 二、什么是C 三、C发展史 四…