数据结构复习笔记(ADT栈/LIFO表)
栈是一种特殊的表,只在表首进行插入和删除操作,表首称之为栈顶,表尾称为栈底;栈的核心原则是先进后出,简称Last In First Out(LIFO表);常用的运算有:1、是否为空栈判断;2、栈是否满判断;3、返回栈顶元素;4、插入栈顶元素;5、删除栈顶元素;
## 用数组实现栈代码:
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<malloc.h>
typedef struct astack *Stack;
typedef struct astack
{
int top;
int maxtop;
int *data; //栈元素数组,可以是int型也可以是其他数据类型比如char;
}Astack;
Stack StackInit(int size,Stack S)
{
S->data=(int*)malloc(size*sizeof(int));
S->maxtop=size;
S->top=-1; //当top为1的时候,代表栈为空;
return S;
}
int StackEmpty(Stack S)
{
return S->top<0;
}
int StackFull(Stack S)
{
return S->top>=S->maxtop; //当top=maxtop时,代表当前栈满
}
int StackTop(Stack S)
{
return S->data[S->top]; //默认认为用户在使用栈时,需要考虑栈为空时无法返回栈顶元素
}
void Push(int x, Stack S)
{
S->top++;
S->data[S->top]=x; //默认用户所使用的栈空间(即在最开始用户开栈时需要提前考虑数组data大小)够大;
}
int Pop(Stack S)
{
S->top--;
return S->data[S->top]; //默认此时栈不为空,否则是非法操作;
}
int main()
{
int i,j,n;
scanf("%d",&n);
Stack S=new Astack;
StackInit(n,S);
Push(0,S);
Push(5,S);
printf("%d",StackTop(S));
// printf("%d",Pop(S));
Pop(S);
Push(2,S);
while(StackEmpty(S)!=1) //当栈不是空的时候,返回0,是空栈返回1;
{
printf("%d",StackTop(S));
Pop(S);
}
return 0;
}
栈的指针实现代码:
#include<cstdio>
#include<cstdlib>
#include<malloc.h>
typedef struct node* link;
typedef struct node //自定义栈内节点数据类型 ;
{
int element;
link next;
}Node;
typedef struct astack* Stack;
typedef struct astack //定一个栈指针,有一个top顶点指针;
{
link top;
}Astack;
Stack StackInit(Stack S)
{
S->top=0;
return S;
}
int StackEmpty(Stack S) //判断top指针是不是空指针;
{
return S->top==0;
}
int StackFull(Stack S) //通过指针实现的栈每次都是直接新开辟一个节点指针,所以只是看这个指针是否开辟成功;
{
link p=(node*)malloc(sizeof(Node));
if(p==NULL)return 1;
else
{
free(p);
return 0;
}
}
int StackTop(Stack S)
{
return S->top->element;
}
void Push(int x,Stack S) //直接插入x;
{
link p;
p=new Node;
p->element=x;
p->next=S->top;
S->top=p;
}
int Pop(Stack S) //每次删除的元素都能够输出此时删除的元素是哪一个;
{
link p;
int x;
x=S->top->element;
p=S->top;
S->top=p->next;
free(p);
return x;
}
int main()
{
int i,j,n;
Stack S=new Astack;
StackInit(S);
// link p=new Node;
Push(0,S);
Push(5,S);
printf("%d",Pop(S));
Push(2,S);
while(StackEmpty(S)!=1)
{
printf("%d",StackTop(S));
Pop(S);
}
return 0;
}
上面描述的都是通过自定义实现的栈的使用,其实还有直接可以使用的STL中的栈(即已经有直接可以使用的栈,比较方便,需要包括头文件stack);
STL中的栈的使用简单介绍使用代码:
#include<cstdio>
#include<cstdlib>
#include<malloc.h>
#include<stack> //使用STL中已有的栈需要包括该文件
#include<iostream>
using namespace std;
stack<int>s;
int main()
{
int i,j,n;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
s.push(i); //将1~n的数字存储到栈中,直接使用s.push(元素);
}
if(s.empty()!=1) //如果栈空,则s.empty()返回1,否则返回0;
{
printf("Stack is not empty!\n");
s.pop(); //此时如果使用s.pop()函数不能同时输出其删除元素,可先使用s.top()得到之后再删除;
}
else
{
printf("Stack is empty!\n");
}
while(s.empty()!=1)
{
printf("%d",s.top());
s.pop();
}
return 0;
}
第三次作业:
1、(栈的基本运算操作:入栈出栈等):可以直接使用STL中的栈(比较懒就这样使用),也可以自定义栈实现(耗时当然比较少);对于题目中的字符串代表不同操作,可以直接针对其首字母处理,会方便一点;
2、(栈的应用:计算中缀表达式结果,包含括号等操作符比如计算{3*(6+9/3-4)+8}的结果):大致思路是使用两个栈,一个存储操作数,一个存储操作符,自定义操作符的优先级处理函数,然后对输入的表达式入栈、判断是否需要出栈、运算等操作;
题目实现代码:
#include<iostream>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<stack>
using namespace std;
stack<int> Num_Stk;
stack<char>Oper_Stk;
int Oper_Big(char ch)
{
if (Oper_Stk.empty() || ch == '(' || (Oper_Stk.top() == '('&&ch != ')'))
{
return 0;
}
else if ((Oper_Stk.top() == '+' || Oper_Stk.top() == '-') && (ch == '*' || ch == '/'))
{
return 0;
}
else if (Oper_Stk.top() == '('&&ch == ')')
{
Oper_Stk.pop(); return 1;
}
else return -1;
}
void Deal_num()
{
int num1 = Num_Stk.top(); Num_Stk.pop();
int num2 = Num_Stk.top(); Num_Stk.pop();
int ans = 0;
if (Oper_Stk.top() == '+') ans = num1 + num2;
else if (Oper_Stk.top() == '-') ans = num2 - num1;
else if (Oper_Stk.top() == '*') ans = num1*num2;
else if (Oper_Stk.top() == '/')ans = num2 / num1;
Num_Stk.push(ans);
Oper_Stk.pop();
}
int main()
{
int num = 0;
char str[1000] = "";
cin >> str;
int i = 0, j = 0, k = 0;
while (str[i] != '\0')
{
char expre[1005]; j = 0;
while (str[i] >= '0'&&str[i] <= '9')
{
expre[j] = str[i]; i++;
j++; expre[j] = '\0';
}
if (str[i] != '(')
{
num = atoi(expre);
Num_Stk.push(num);
}
while (1)
{
k = Oper_Big(str[i]);
if (k == 0)
{
Oper_Stk.push(str[i]);
break;
}
else if (k == 1)
{
i++;
}
else if (k == -1)
{
Deal_num();
}
}
i++;
}
cout << Num_Stk.top() << endl;
return 0;
}
数据结构复习笔记(ADT栈/LIFO表)的更多相关文章
- 【Java数据结构学习笔记之一】线性表的存储结构及其代码实现
应用程序后在那个的数据大致有四种基本的逻辑结构: 集合:数据元素之间只有"同属于一个集合"的关系 线性结构:数据元素之间存在一个对一个的关系 树形结构:数据元素之间存在一个对多个关 ...
- JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)
前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...
- java实现 数据结构:链表、 栈、 队列、优先级队列、哈希表
java实现 数据结构:链表. 栈. 队列.优先级队列.哈希表 数据结构javavector工作importlist 最近在准备找工作的事情,就复习了一下java.翻了一下书和网上的教材,发现虽然 ...
- JS数据结构第四篇 --- 栈
一.什么是数据结构栈 在数据结构中有一个栈结构,在内存空间中也有一个栈空间,这两个”栈“是两个不同的概念.这篇我们说的是数据结构中的栈.栈是一种特殊的线性表,特殊性在哪?就是只能在栈顶进行操作,往栈顶 ...
- Java基础复习笔记系列 四 数组
Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...
- Java数据结构和算法之栈与队列
二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为 ...
- php数据结构课程---4、栈(是什么)
php数据结构课程---4.栈(是什么) 一.总结 一句话总结: 栈(stack),它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算. 1.栈的链表实现? 定义node,设置属性d ...
- 我理解的数据结构(二)—— 栈(Stack)
我理解的数据结构(二)-- 栈(Stack) 一.栈基础 栈是一种线性结构 相比较数组,栈对应的操作是数组的子集 只能从一端添加元素,也只能从同一端取出元素,这一端称为栈顶 栈是一种后进先出的数据结构 ...
- angular复习笔记4-模板
Angular复习笔记4-模板 简介 模板是一种自定义的标准化页面,通过模板和模板中的数据结合,可以生成各种各样的网页.在Angular中,模板的默认语言是HTML,几乎所有的HTML语法在模板中都是 ...
随机推荐
- Hibernate第二天——实体类 与缓存机制
第二天,我们先来了解一下框架里的一个重要概念:实体类 实体类:把数据表或其它持久化数据的格式映射成的类,就是实体类. 实体类的编写规则:由于对应的是javabean,因而也遵循javabean的一些规 ...
- Linux tree 命令乱码
今天在执行Linux下的tree命令的时候,出现了乱码.上网查了一下说需要使用tree --charset ASCII,强制使用ASCII字符.这样确实可以输出正常了.但是我的环境里的LANG=US. ...
- 2_C语言中的数据类型 (七)printf与scanf
1 字符串格式化输出和输入 1.1 字符串在计算机内部的存储方式 字符串是内存中一段连续的char空间,以’\0’结尾 “”是C语言表达字符串的方式 1.2 ...
- Docker与CI持续集成/CD(转)
背景 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会 ...
- javaweb学习2——HTTP协议
声明:本文只是自学过程中,记录自己不会的知识点的摘要,如果想详细学习JavaWeb,请到孤傲苍狼博客学习,JavaWeb学习点此跳转 本文链接:https://www.cnblogs.com/xdp- ...
- 设置JFrame背景图片
这里我就放上改写的代码吧,不做多的解释,推荐一个好的博文 https://blog.csdn.net/jdsjlzx/article/details/16831815 public void ini_ ...
- Tetris(俄罗斯方块)
一天有个小朋友问我OpenGL俄罗斯方块怎么写. 俄罗斯方块分成两部分游戏逻辑和画面渲染. 1. 游戏逻辑 一个简单的俄罗斯方块的逻辑部分需要考虑的情况如下: 1. 方块的表示(坐标, 旋转, 上下左 ...
- Unity优化方向——优化Unity游戏中的图形渲染(译)
CPU bound:CPU性能边界,是指CPU计算时一直处于占用率很高的情况. GPU bound:GPU性能边界,同样的是指GPU计算时一直处于占用率很高的情况. 原文:https://unity3 ...
- 关于IPointerEnterHandler和IpointerExitHandler的简单说明
自己在学习UGUI背包系统时用到了,而且遇到一些问题,所以在这里写一下这两个接口的简单说明. 继承IPointerEnterHandler和IpointerExitHandler这两个接口后可以实现两 ...
- LeetCode 刷题笔记 155. 最小栈(Min Stack)
tag: 栈(stack) 题目描述 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素 ...