博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构 栈与队列(二) 栈的基本操作
阅读量:3958 次
发布时间:2019-05-24

本文共 3687 字,大约阅读时间需要 12 分钟。

数据结构(五)

学习数据结构与算法过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流。

—— 栈的基本操作 ——

1.题目描述

栈是一种重要的数据结构,它具有push k和pop操作。push k是将数字k加入到栈中,pop则是从栈中取一个数出来。

栈是后进先出的:把栈也看成横向的一个通道,则push k是将k放到栈的最右边,而pop也是从栈的最右边取出一个数。

假设栈当前从左至右含有1和2两个数,则执行push 5和pop操作示例图如下:

push 5          pop   栈   1 2  ------->  1 2 5 ------>  1 2

现在,假设栈是空的。给定一系列push k和pop操作之后,输出栈中存储的数字。若栈已经空了,仍然接收到pop操作, 则输出error。

1.1输入

第一行为m,表示有m组测试输入,m<100。 每组第一行为n,表示下列有n行push k或pop操作。(n<150)

接下来n行,每行是push k或者pop,其中k是一个整数。 (输入保证同时在栈中的数不会超过100个)

1.2输出

对每组测试数据输出一行。该行内容在正常情况下,是栈中从左到右存储的数字,数字直接以一个空格分隔,如果栈空,则不作输出;但若操作过程中出现栈已空仍然收到pop,则输出error。

1.3样例输入与输出

样例输入

2
4
push 1
push 3
pop
push 5
1
pop
样例输出
1 5
error

2.代码实现

c

#include 
#include
#include
#include
typedef int ElemType;//栈内结构体typedef struct{
//存储输入的数据 ElemType data; //指向下一个输入的数据,即上一层的数据 struct node *link;}node;//永远指向栈内最上面的数据的指针typedef struct{
//指向最上层数据节点的指针 node *top;}Stack;//创建头结点Stack* createStack(){
Stack *head; head = (Stack*)malloc(sizeof(Stack)); head->top=NULL; return head;}//压栈void push(Stack *myStack, ElemType x){
node *t, *p; p=myStack->top; t=(node*)malloc(sizeof(node)); t->data = x; t->link=p; myStack->top=t;}//判断栈内是否为空bool empty(Stack *myStack){
if(myStack->top!=NULL) return false; else return true;}//用于显示和输出栈内最上层的数据ElemType top(Stack *myStack){
ElemType n; n = myStack->top->data; return n;}//出栈void pop(Stack *myStack){
node *p; p=myStack->top; myStack->top=p->link; free(p);}//销毁所有节点bool destroy(Stack *myStack){
free(myStack); return false;}int main(void){
//指向最上层数据节点的指针 Stack *head; ElemType c; int n, m; scanf("%d", &n); while(n--) {
//判断是否已经出现错误error int flag = 0; //创建头结点 head = createStack(); scanf("%d", &m); while(m--) {
char str[10]; scanf("\n%s", str); //如果是push,则压栈 if(strcmp(str,"push")==0) {
scanf("%d", &c); //如果已经出现错误则不作任何操作 if(flag == 1) continue; push(head, c); } //如果是pop,则出栈 if(strcmp(str,"pop")==0) {
//如果栈内为空 if (empty(head)) {
//如果已经出现错误则不作出任何操作 if(flag == 1) continue; printf("error\n"); //栈内为空还进行pop出栈操作直接报错,且将flag改为出错状态 flag = 1; } //如果栈内不空 else {
//如果已经出现错误则不作出任何操作 if(flag == 1) continue; //出栈 pop(head); } } } int num[151]; int wal = 0; //当没有出现错误的时候运行输出操作 if(flag == 0) {
//将栈内数据移存至数组内 while (!empty(head)) {
c = top(head); num[wal] = c; wal++; pop(head); } //循环输出 while(wal--) {
flag = 1; printf("%d ", num[wal]); } if(flag == 1) printf("\n"); } //销毁所有节点 destroy(head); } return 0;}

3.代码说明

栈的储存方式是先进后出,而题目中所涉及到的几种基本操作机制如下:

3.1 入栈操作

栈的基本操作

在插入第一个节点之前,栈内为空,指向顶层数据节点的指针也指向为空。在进行各种操作之后:
站的基本操作
当插入数据节点后,指针将指向顶层数据节点。
在这里插入图片描述
在插入下一个数据节点之后,指针将移动到最顶层的数据节点。

3.2 出栈操作

在栈内还有数据节点的时候,进行数据的出栈操作:

在这里插入图片描述
出栈后,指针将指向下一层数据节点。

3.3 error操作

下面展示会显示错误的操作:

在这里插入图片描述

如果当栈内没有数据节点的时候,如果还进行pop出栈操作,就会显示error的错误提示。

在这里插入图片描述

转载地址:http://pfazi.baihongyu.com/

你可能感兴趣的文章
HTTP请求之POST与GET区别
查看>>
SSM结合Redis
查看>>
优化数据库的八种方法
查看>>
Java Web服务收到请求时线程的情况以及session情况
查看>>
SSM配置文件信息加密实现
查看>>
@Produces注解
查看>>
谈谈序列化—实体bean一定要实现Serializable接口?
查看>>
实用小技巧之电脑如何滚动截屏/截取长图
查看>>
Eclipse离线安装Java Decompiler插件
查看>>
Http预请求options
查看>>
未来设计师的工作模式?从室内设计领域的实时设计说起 | Mixlab趋势
查看>>
智能设计 | MixAI 知识库 No.69
查看>>
通过研究微信文章的相关推荐逻辑 ,尝试生成指南| Mixlab设计黑客
查看>>
浏览器低成本实现免手提的用户体验,使用人脸、手势、姿态追踪 | Mix群聊
查看>>
这个世界上肯定有另一个我,做着我不敢做的事,过着我想过的生活 | MixAI 知识库 No.70...
查看>>
表情包数据挖掘 | Mix群聊
查看>>
如何阅读科研论文
查看>>
理解本真的REST架构风格
查看>>
10款免费且开源的项目管理工具
查看>>
java调用javascript :js引擎rhino
查看>>