精华内容
下载资源
问答
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼gets(szExpression);// 中缀表达式转后缀表达式,结果保存在expression中for (int i = 0; i < strlen(szExpression); i++){if (isspace(szExpression[i])) // 空白...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

    gets(szExpression);

    // 中缀表达式转后缀表达式,结果保存在expression中

    for (int i = 0; i < strlen(szExpression); i++)

    {

    if (isspace(szExpression[i])) // 空白字符

    {

    if (bFindBegin)

    {

    expression[num].type = 1;

    expression[num].element.int_element = atoi(pbegin);

    num++;

    bFindBegin = false;

    }

    continue;

    }

    if (isdigit(szExpression[i])) // 数字字符

    {

    if (!bFindBegin)

    {

    pbegin = &szExpression[i];

    bFindBegin = true;

    }

    continue;

    }

    c = szExpression[i];

    if (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')') // 操作符字符

    {

    if (bFindBegin)

    {

    expression[num].type = 1;

    expression[num].element.int_element = atoi(pbegin);

    num++;

    bFindBegin = false;

    }

    if (c != ')')

    {

    if (!isEmpty(pSymboolStack)) // 存在操作符

    {

    if (c == '(') // 直接入栈

    push(pSymboolStack, c);

    else {

    do

    {

    char topElement = top(pSymboolStack);

    if (compare(topElement, c) >= 0 && topElement != '(') // 优先级不低于c且栈顶不等于'(',则出栈

    {

    expression[num].type = 2;

    expression[num].element.char_element = topElement;

    num++;

    pop(pSymboolStack);

    }

    else

    break;

    } while (!isEmpty(pSymboolStack));

    // c入栈

    push(pSymboolStack, c);

    }

    } // 不存在操作符,直接入栈

    else

    push(pSymboolStack, c);

    }

    else // c == ')'

    {

    while( (c =top(pSymboolStack)) != '(')

    {

    expression[num].type = 2;

    expression[num].element.char_element = c;

    num++;

    展开全文
  • #include<stdio.h> #include<stdlib.h> typedef int Elemtype; typedef struct node { Elemtype data; struct node* next;...//底指针 }stack; void initstack(stack*);//的初始化 void push

    /本程序中包含对栈的入栈、出栈、遍历、统计栈的元素个数、取栈顶元素等基本常用操作/
    #include<stdio.h>
    #include<stdlib.h>
    typedef int Elemtype;
    typedef struct node
    {
    Elemtype data;
    struct node* next;
    }node;
    typedef struct stack
    {
    struct node* top;//栈顶指针
    struct node* bottom;//栈底指针
    }stack;
    void initstack(stack*);//栈的初始化
    void pushstack(stack*,int);//入栈
    bool popstack(stack*,int*);//出栈
    //出栈的第二个参数可以要,可以不要,如果想查看出栈的元素的数据的话
    //就可以用指针先修改它的值,之后在其他地方也是可以访问的
    void traverse(stack* );//遍历栈的所有元素
    void clear(stack* );//清空
    bool empty(stack* );//判断栈是否为空
    void calculate(stack* );//计算栈的长度
    int main(void)
    {
    stack s;
    int val;
    initstack(&s);
    pushstack(&s, 1);
    pushstack(&s, 2);
    pushstack(&s, 3);
    pushstack(&s, 4);
    traverse(&s);
    popstack(&s,&val);
    traverse(&s);
    calculate(&s);
    clear(&s);
    calculate(&s);
    system(“pause”);
    return 0;
    }
    void initstack(stackps)
    {
    ps->top = (node
    )malloc(sizeof(node));
    if (!ps->top)
    {
    printf(“分配内存空间失败\n”);
    exit(-1);
    }
    else
    {
    ps->bottom = ps->top;
    //刚开始栈顶指针和栈底指针都指向同一块内存
    /(注意这块内存知识作为一个标志使用,该内存一般是不用来存储数据的,如果要存储数据的话,那么就是该栈元素的个数)/
    ps->top->next = NULL;//一定要将ps的下一个节点
    //也就是链表中的头节点的指针域指向尾空
    //也可以这样写
    //ps->bottom->next = NULL;
    printf(“栈的初始化已完成\n”);
    }
    }
    void pushstack(stackps,int val)
    {
    //由于入栈不需要判断栈满,所以不需要返回值进行标识
    //先生成一个节点,再将数据域进行赋值,然后再进行指针的连接
    //再将栈的栈顶指针指向这个新生成的节点
    node
    p = (node*)malloc(sizeof(node));
    if (!p)
    {
    printf(“分配内存空间失败\n”);
    return;
    }
    else
    {
    p->data = val;
    p->next = ps->top;
    ps->top = p;//一定要将新插入的结构作为栈顶结点,所以要将新增加的p结点的地址赋值给该栈的栈顶指针top
    printf(“入栈成功\n”);
    }
    }
    bool empty(stack* ps)
    {
    if (ps->bottom == ps->top)
    {
    return true;
    }
    else
    {
    return false;
    }
    }
    bool popstack(stackps, intval)
    {//将出栈元素的值保存在val这个变量中
    if (!empty(ps))//这个地方就不用传入ps的地址了,因为ps本身就是一个指针
    {
    //如果栈不为空
    node* p = ps->top;
    val = p->data;
    ps->top = p->next;
    free§;
    p = NULL;
    printf("%d已出栈成功\n",val);
    return true;
    /注意不要直接free掉栈的top指针,因为一旦直接free掉的话,那么下一次寻找该栈顶元素就找不到了,必须将该该的栈顶元素的下一个元素的地址进行一个保存,那么在free掉栈顶元素之后,我们还可以通过保存的地址,找到新的栈顶元素的地址,从而访问栈顶元素 /
    }
    else
    {
    return false;
    }
    }
    void traverse(stack
    ps)
    {
    /注意在遍历的时候,不能改变栈中原先的栈顶指针的位置/
    node
    p = ps->top;
    if (empty(ps))//栈为空
    {
    printf(“栈为空,无法进行遍历操作\n”);
    return;
    }
    else
    {
    while (p!=ps->bottom)
    {
    printf("%d\t", p->data);
    p = p->next;
    //栈顶指针是指向最后一个有数据的元素
    //栈底指针是指向第一个有数据的元素的前一个数据(相当于链表的头节点)
    //所以可以通过这个方式将栈内的所有元素都打印出来
    }
    printf("\n");
    }
    }
    void clear(stack
    ps)
    {
    node
    p = ps->top,q=NULL;
    while (p!=ps->bottom)
    {
    q = p;
    p = p->next;
    free(q);//知道q指向栈底指针的上一个数据元素(就相当于那个无用的头节点)
    //不用将p指向NULL,因为p还要指向下一个有数据的节点(即将被删除的)
    }
    ps->top = ps->bottom;//注意最后还要将栈顶指针置为栈底指针的地址
    //让他们指向同一块内存区域
    printf(“栈已经被清空\n”);
    }
    void calculate(stack
    ps)
    {
    node* p = ps->top;
    //我们为什么要将栈顶指针赋值给一个变量
    //因为我们只是单纯的计算栈的长度,是不允许修改栈的栈顶指针和栈顶指针的指向的
    int count = 0;
    while (p!=ps->bottom)//注意不能用栈是否为空来表示,
    //因为用栈是否为空的条件来表示的话,栈顶指针永远不会移动
    {
    count++;
    p = p->next;
    }
    printf(“栈的长度尾%d\n”, count);
    }

    /*注意链栈中一般是不会出现栈满的情况的,因为它是通过指针来指向的,改变指针的指向就可以进行插入和删除元素等操作,可以通过动态分配内存来给增加的元素分配内存空间,所以一般情况下是不会发生栈满的情况的,如果这种情况发生,那么内存中的空间就一定不够了,电脑也会面临卡顿死机的状况了!

    但是对于线性存储结构,是利用数组来存放的,由于数组是预先就分配好空间的,所以就会存在栈满的情况。

    所以我们在用线性存储结构的时候通常会有一个检验栈满的操作,但是在链式存储结构中就没有*/

    展开全文
  • 计算机二级考试公共基础知识点:及其基本运算2018年计算机二级考试公共基础知识点:及其基本运算考点5及其基本运算考试链接:考点5在笔试考试中,是一必考的内容,在笔试考试中出现的几率为100%,主要是以...

    计算机二级考试公共基础知识点:栈及其基本运算2018年计算机二级考试公共基础知识点:栈及其基本运算考点5栈及其基本运算

    考试链接:

    考点5在笔试考试中,是一个必考的内容,在笔试考试中出现的几率为100%,主要是以选择的形式出现,分值为2分,此考点为重点掌握内容,读者应该掌握栈的运算。

    1.栈的基本概念

    栈是限定只在一端进行插入与删除的线性表,通常称插入、删除的这一端为栈顶,另一端为栈底。当表中没有元素时称为空栈。栈顶元素总是后被插入的元素,从而也是最先被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素。栈是按照先进后出或后进先出的原则组织数据的。

    2.栈的顺序存储及其运算

    用一维数组S(1∶m)作为栈的顺序存储空间,其中m为最大容量。

    在栈的顺序存储空间S(1∶m)中,S(bottom)为栈底元素,S(top)为栈顶元素。top=0表示栈空;top=m表示栈满。

    栈的基本运算有三种:入栈、退栈与读栈顶元素。

    (1)入栈运算:入栈运算是指在栈顶位置插入一个新元素。首先将栈顶指针加一(即top加1),然后将新元素插入到栈顶指针指向的位置。当栈顶指针已经指向存储空间的最后一个位置时,说明栈空间已满,不可能再进行入栈操作。这种情况称为栈上溢错误。

    展开全文
  • 虚拟机之操作数栈

    2021-09-14 15:02:07
    每一栈帧中除了包含局部变量表以外,还包含一后进先出的操作数栈,也称为表达式。 操作数栈在方法执行的时候,根据字节码指令,往中写入数据或提取数据,即入栈(push)/出栈(pop)。 某些字节码指令将值压...

    一、概述

    1. 每一个栈帧中除了包含局部变量表以外,还包含一个后进先出的操作数栈,也称为表达式栈。
    2. 操作数栈在方法执行的时候,根据字节码指令,往栈中写入数据或提取数据,即入栈(push)/出栈(pop)。
    3. 某些字节码指令将值压入操作数栈,其余的字节码指令将操作数取出栈。使用后再把结构压入栈。比如执行复制、交换、求和等操作。
      在这里插入图片描述

    二、操作数栈的作用

    1. 操作数栈主要是用于保存计算过程中间结果,同时作为计算过程中变量临时的存储空间。
    2. 操作数栈就是JVM执行引擎的一个工作区,当一个方法刚开始执行的时候,一个新的栈帧也会随之被创建出来,这个方法的操作数栈是空的。
    3. 每一个操作数栈都会拥有一个明确的栈深度用于存储数值,其所需的最大深度在编译期就是定义好了,保存在方法的code属性中,为max_stack的值。
    4. 32bit的类型只占一个栈单位深度,64bit的类型占两个栈单位深度。
    5. 操作数栈并非采用访问索引的方式来进行数据访问的,而是只能通过标准的入栈(push)/出栈(pop)操作完成一次数据访问。
    6. 如果被调用的方法代返回值的话,其返回值将会被压入当前栈帧的操作数栈中,并更新PC寄存器到下一条需要执行的字节码指令。
    7. 操作数栈中元素的数据类型必须要与字节码指令的序列严格匹配,这由编译期进行验证,同时在累加载的时候中的类检验阶段的数据流分析阶段再次验证。
    8. 另外,我们说Java虚拟机的解释引擎是基于栈的执行引擎,其中的栈指的就是操作数栈。

    三、操作数栈中的字节码指令

    • push:将值放入操作数栈中。
    • store:将值从操作数栈中移到局部变量表中。
    • load:将值从局部变量表中移到操作数栈中。

    四、栈顶缓存技术

    由于操作数是存储在内存中的,因此频繁地执行内存读/写操作必然会影响执行速度。为了解决这个问题,HotSpot JVM的设计者们提出栈顶缓存技术,将栈顶的元素全部缓存到物理CPU的寄存器上,以此降低对内存的读/写次数,提升引擎的执行效率。

    展开全文
  • JVM以方法作为最基本的执行单元,栈帧则是用于支持虚拟机进行方法调用与方法执行背后的数据结构,同样它也是JVM运行时数据区中的虚拟机栈的栈元素
  • 操作数栈每一独立的桢中除了包含局部变量表以外,还包含一后进先出的操作数栈,也可以称之为表达式。操作数栈,在方法执行过程中,根据字节码指令,往中写入数据或提取数据,即入栈/出栈某些字节码指令将...
  • 文章目录思想删除元素移掉K位数字去除重复字母拼接最大(hard)思路代码书写范式完整代码 思想删除元素 什么时候用? 移除元素+不限制空间复杂度+使得数值最小之类的 字符串中删除重复字符使得剩下的字典序...
  • 每一独立的栈帧除了包含局部变量表以外,还包含一后进先出的操作数栈,也可以称之为 表达式(Expression Stack); 操作数栈,在方法执行过程中,根据字节码指令,往中写入数据或提取数据,即入栈(push)和 ...
  • 基本思路:(1)通过一...b、如果符号不为空,就要进行优先级的比较:1、如果 当前扫描到的操作符 的优先级 小于或等于 栈顶的操作符,就要从数栈 中pop出两个数,同时从 符号 中 pop 出一符号,构成运算式进...
  • (1)操作数栈,主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空间。 (2)操作数栈就是JVM执行引擎的一工作区,当一方法刚开始执行的时候,一新的栈帧也会随之被创建出来,这方法的...
  • 数据结构中有一结论:对于n不同的元素进栈,将出栈顺序记录为一组元素序列,那么总共会有1n+1C2nn\frac{1}{n+1}C_{2n}^{n}n+11​C2nn​不同的出栈顺序的元素序列。 这结论的通俗理解(记忆)思路 ...
  • 1.看成~~求x号盒子之前有多少盒子。 2.算法:用x号减去最前面的盒子编号。 A:思路:上方元素+下方元素 B:步骤: 1.求出front盒子之前的盒子 (front) 2.用所有的盒子减去front之前的盒子求得上方所有的元素...
  • Overview每一独立的栈帧中除了包含局部变量表以外,还包含一后进先出的操作数栈,也可以成为表达式。操作数栈,在方法执行过程中,根据字节码指令,往中写入数据或提取数据,即入栈(push)或出栈(pop)notice:...
  • 栈和队列是应用最多的数据结构之二,有数组实现和链表实现两种方式。当需要对容器做出限制,只允许一边插入和取出数据时,则需要用到栈。下面将总结数组实现的栈和阐述其...(2) 计算栈长度(栈中节点个数) (3) 插入节
  • 第 5 章 虚拟机 1、虚拟机概述 -Xss512k 设置内存大小为512k 1.1、虚拟机的出现背景 文档网址 https://docs.oracle.com/javase/specs/jvms/se8/html/index.html 虚拟机出现的背景 由于跨平台性...
  • C语言数据结构-

    2021-05-24 08:46:27
    只有一出口,允许新增元素(只能在栈顶上增加)、移出元素(只能移出栈顶元素)、取得栈顶元素等操作。在STL中,是以别的容器作为底部结构,再将接口改变,使之符合的特性就可以了。二、代码实现// main.c// C ...
  • 栈帧——操作数栈

    2021-08-27 17:26:46
    操作数栈主要用于保存计算过程的中间结果,同时作为计算过程中临时的存储空间。 操作数栈是JVM执行引擎的一工作区,当一方法刚开始执行得时候,一新的栈帧也会随之被创建出来,其操作数栈是空的。 每一操作...
  • 数字 x 的下一更大的元素是按数组遍历顺序,这数字之后的第一比它更大的,这意味着你应该循环地搜索它的下一更大的。如果不存在,则输出 -1。 示例 1: 输入: [1,2,1] 输出: [2,-1,2] 解释: 第一 1 的...
  • 1. 的基本概念是一后进先出(或先进后出)的线性表,只能在线性表的一端进行删除和插入操作。允许插入与删除的一端称为栈顶(top),与之对应的另一端称为底(bottom);插入操作称为入栈,删除操作称为出栈。图像...
  • 创建两个栈,一用来存储数据,一用来...截下来在存入*之前我们进行比较,如果新存入的运算符的优先级小于等于已经在里面的我们就先将中的元素取出,从数据中取出两个元素进行运算将运算后的数据重新存入
  • 解决括号匹配和后缀表达式的计算问题 前言 存储货物或供旅客住宿的地方,可引申为仓库、中转站 。例如我们现在生活中的酒店,在古时候叫客栈,是供旅客休息的地方,旅客可以进客栈休息,休息完毕后就离开客栈。我们...
  • java集合-Stack()详解

    千次阅读 2021-02-26 21:15:24
    一、简介是一种用于存数据的简单数据结构(与链表类似)。数据入栈的次序是的关键。可以把自助残定中的一堆盘子看作一个栈的例子。当盘子洗干净后,他们会添加到的顶端。当需要盘子時,也是从的顶端拿取。...
  • 是什么 我们平常说的Java/JVM的执行引擎是基于的执行引擎,其实指...操作数栈是JVM执行引擎的一工作区,当一方法刚开始执行的时候,会创建一新的栈帧,这时候栈帧中的操作数栈是空的(空的不代表没有长度)
  • 用两个栈实现队列:class QueueWithTwoStacks(object):def __init__(self):self._stack1 = []self._stack2 = []def appendTail(self,x):self._stack1.append(x)def deleteHead(self):if self._stack2:return self._...
  • 的实现和菜单的实现 注释中有详尽的代码解释 有问题可以私信问。。。。 import java.util.*; public class MyStackTest { public static void main(String[] args) throws Exception { MyStack<Object>...
  • 现经过一系列入栈与退运算后,top=20,则当前中的元素个数为( )。A.30 B.29 C.20 D.19【答案】C 【随讲随练16-11】设的顺序存储空间为S(1: m),初始状态为top=m+1。现经过一系列入栈与退运算后,top=20,...
  • 概念介绍 中缀表达式 : 或中缀记法)是一通用的算术或逻辑公式表示方法, 操作符是以中缀形式...3.2:如果发现符号有操作符,就进行比较,如果当前的操作符优先级小于或等于中的操作符,就需要从数栈pop出两个数
  • 给定一节点为n的无序单链表,对其按升序排序。 示例1 输入:[1,3,2,4,5] 返回值:{1,2,3,4,5} 思路:辅助数组,将原链表中的数据取出来放在一新数组中,然后对这数组进行排序,排序之后再将数组中的有序...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 134,939
精华内容 53,975
关键字:

怎么计算栈的元素个数