C语言顺序栈的入栈_出栈_判空_取栈顶元素_遍历栈内元素

2023-11-07 02:48

本文主要是介绍C语言顺序栈的入栈_出栈_判空_取栈顶元素_遍历栈内元素,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

顺序栈

顺序栈的入栈出栈操作

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>#define TURE 1;
#define FALSE 0;
#define STACK_INIT_SIZE 100      //设栈中元素有100个
#define STACK_INCREMENT 10typedef struct
{// 栈底指针,若为空NULL则表示栈结构不存在char *base;// 栈顶指针,始终指向栈顶元素的下一个位置,//初始时top==base,可作为空栈标记char *top;// 栈的长度,元素为单位int StackSize;}SeqStack;/*栈的初始化*/
int InitStack(SeqStack *S)
{S->base = (char *)malloc( STACK_INIT_SIZE * sizeof(char) );//S->base为NULL,则!S->base为真if( !S->base ){printf("空间已满\n");return FALSE;}else{//空栈S->top = S->base;S->StackSize = STACK_INIT_SIZE;}return TURE;
}/*判断栈是否为空*/
int IsEmpty(SeqStack *S)
{//栈顶指针等于栈顶指针,表明为空栈if( S->top == S->base ){return TURE;}else{return FALSE;}
}/*入栈操作*/
int Push(SeqStack *S, char x)
{if( ( S->top ) - ( S->base ) == S->StackSize ){//栈已满,用realloc追加空间,应该是在原内存块后面继续追加空间的,//但如果原内存块后面没有空间了,就得重新分配一块内存空间了//realloc返回一个指针,如果请求失败,则返回NULL。S->base = (char *)realloc(S->base, (S->StackSize + STACK_INCREMENT) * sizeof(char) );if( S->base == NULL ){return FALSE;}//更新栈顶指针位置S->top = S->base + S->StackSize;S->StackSize = S->StackSize + STACK_INCREMENT;}//将元素x插入栈顶指针所指向的内存位置*S->top = x;//栈顶指针向上移动S->top++;return TURE;
}/*出栈操作*/
int Pop(SeqStack *S, char *x)
{//若栈不空,则删除栈顶元素,并用x返回其值//并返回TRUE,否则返回FALSE//栈为空if( S->top == S->base ){return FALSE;}else{S->top--;//*代表取指针所存内存地址的内容*x = *S->top;return TURE;}}/*取栈顶元素*/
int GetTop(SeqStack *S, char *x)
{//若栈不空,则将栈顶元素保存至x,并返回TURE//否则返回FALSE//空栈if( S->top == S->base ){return FALSE;}else{//*代表取指针所指内存地址里的内容*x = *( S->top - 1 );return TURE;}}/*遍历输出栈中所有元素*/
void PrintStack(SeqStack *S)
{printf("\n打印栈元素:");char *i;//空栈if( S->top == S->base ){printf("空栈!\n");}else{for(i=S->base; i<S->top; i++){printf("%c ", *i);}printf("\n");}
}int Create26LetterSeqStack(SeqStack *S)
{int i;for(i=1; i<=26; i++){Push(S, i+'a'-1);}return TURE;
}int main()
{int n, flag;char x;SeqStack s, t;// 26字母顺序栈// 顺序栈的初始化flag = InitStack(&t);if( flag ){printf("顺序栈初始化成功!\n");}else{printf("顺序栈初始化失败!\n");}//创建26字母顺序栈flag = Create26LetterSeqStack(&t);if( flag ){printf("\n26字母顺序栈创建成功!\n");}else{printf("\n26字母顺序栈创建失败!\n");}//遍历栈元素PrintStack(&t);//取栈顶元素flag = GetTop(&t, &x);if( flag ){printf("\n栈顶元素为:%c\n", x);}else{printf("\n取栈顶元素失败!\n");}//遍历栈元素PrintStack(&t);//出栈操作flag = Pop(&t, &x);if( flag ){printf("\n出栈元素为:%c\n", x);}else{printf("\n出栈失败!\n");}//遍历栈元素PrintStack(&t);printf("\n----------------------\n");//栈的初始化,成功返回TUREflag = InitStack(&s);if( flag ){printf("顺序栈初始化成功!\n");}else{printf("顺序栈初始化失败!\n");}//入栈操作printf("\n请输入入栈元素个数:");scanf("%d", &n);getchar();  //吃掉回车,具体请百度printf("\n请依次输入入栈元素:\n");for(int i = 0; i < n; i++){x = getchar();getchar();flag = Push(&s, x);if( !flag ){printf("入栈失败!\n");}}//取栈顶元素flag = GetTop(&s, &x);if( flag ){printf("\n栈顶元素为:%c\n", x);}else{printf("\n取栈顶元素失败!\n");}//遍历栈元素PrintStack(&s);//出栈操作flag = Pop(&s, &x);if( flag ){printf("\n出栈元素为:%c\n", x);}else{printf("\n出栈失败!\n");}//遍历栈元素PrintStack(&s);//判断栈是否为空printf("\n栈是否为空?:");flag = IsEmpty(&s);if( flag ){printf("空栈!\n");}else{printf("非空!\n");}}

 

这篇关于C语言顺序栈的入栈_出栈_判空_取栈顶元素_遍历栈内元素的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/360742

相关文章

把Python列表中的元素移动到开头的三种方法

《把Python列表中的元素移动到开头的三种方法》在Python编程中,我们经常需要对列表(list)进行操作,有时,我们希望将列表中的某个元素移动到最前面,使其成为第一项,本文给大家介绍了把Pyth... 目录一、查找删除插入法1. 找到元素的索引2. 移除元素3. 插入到列表开头二、使用列表切片(Lis

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化