SDUT-2133_数据结构实验之栈与队列三:后缀式求值
数据结构实验之栈与队列三:后缀式求值
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
对于一个基于二元运算符的后缀表示式(基本操作数都是一位正整数),求其代表的算术表达式的值。
Input
输入一个算术表达式的后缀式字符串,以‘#’作为结束标志。
Output
求该后缀式所对应的算术表达式的值,并输出之。
Sample Input
59*684/-3*+#
Sample Output
57
Hint
基本操作数都是一位正整数!
简单的后缀表达式求值,也告诉了我们为什么会转化成后缀,严格按照从左往右进行就可以了。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
{
    int data;
    struct node *next;
}Node;
typedef struct stack
{
    Node *base,*top;
}Stack;
Node *newnode()
{
    Node *t;
    t = (Node *)malloc(sizeof(Node));
    t->next = NULL;
    return t;
};
Stack *Newstack()
{
    Stack *t;
    t = (Stack *)malloc(sizeof(Stack));
    t->top = newnode();
    t->base = t->top;
    return t;
}
void push(Stack *t,int x)
{
    Node *p = newnode();
    p->data = x;
    p->next = t->top->next;
    t->top->next = p;
    t->base = p;
}
int top(Stack *t)
{
    return t->top->next->data;
}
void pop(Stack *t)
{
    Node *p;
    p = t->top->next;
    t->top->next = t->top->next->next;
    free(p);
}
int empty(Stack *t)
{
    if(t->top->next==NULL)
        return 1;
    return 0;
}
int main()
{
    Stack *t;
    char s[100050];
    int i;
    scanf("%s",s);
    t = Newstack();
    for(i=0;s[i]!='#';i++)
    {
        if(s[i]>='0'&&s[i]<='9')
            push(t,s[i] - '0');
        else
        {
            int a,b;
            a = top(t);
            pop(t);
            b = top(t);
            pop(t);
            if(s[i]=='+')
                push(t,a+b);
            else if(s[i]=='-')
                push(t,b-a);
            else if(s[i]=='*')
                push(t,a*b);
            else if(s[i]=='/')
                push(t,b/a);
        }
    }
    printf("%d\n",top(t));
    return 0;
}
线性表
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Stack
{
    int *top,*base;
}Stack;
Stack newStack()
{
    Stack t;
    t.top = (int *)malloc(100050*sizeof(int));
    t.base = t.top;
    return t;
}
void push(Stack *t,int x)
{
    *(t->top++) = x;
}
int top(Stack t)
{
    return *(t.top-1);
}
void pop(Stack *t)
{
    t->top--;
}
int Empty(Stack t)
{
    if(t.top==t.base)
        return 1;
    return 0;
}
int main()
{
    char s[100050];
    int i,a,b;
    Stack t;
    t = newStack();
    scanf("%s",s);
    for(i=0;s[i]!='#';i++)
    {
        if(s[i]>='0'&&s[i]<='9')
            push(&t,s[i] - '0');
        else
        {
            a = top(t);
            pop(&t);
            b = top(t);
            pop(&t);
            if(s[i]=='+')
                push(&t,a+b);
            else if(s[i]=='*')
                push(&t,a*b);
            else if(s[i]=='-')
                push(&t,b-a);
            else if(s[i]=='/')
                push(&t,b/a);
        }
    }
    printf("%d\n",top(t));
    return 0;
}
												
											SDUT-2133_数据结构实验之栈与队列三:后缀式求值的更多相关文章
- 数据结构实验之栈与队列三:后缀式求值(SDUT 2133)
		
题解:把每一步计算的答案再存在栈里面,直到计算结束. 如果是操作数 那么直接入栈:如果是运算符,那么把栈里面最顶部的两个操作数拿出来进行运算,运算结果再放入到栈里面,计算完所有的(#之前的长度位len ...
 - SDUT-2088_数据结构实验之栈与队列十一:refresh的停车场
		
数据结构实验之栈与队列十一:refresh的停车场 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description refresh最近发 ...
 - SDUT-2449_数据结构实验之栈与队列十:走迷宫
		
数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起 ...
 - SDUT-1479_数据结构实验之栈与队列九:行编辑器
		
数据结构实验之栈与队列九:行编辑器 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个简单的行编辑程序的功能是:接受用 ...
 - SDUT-3335_数据结构实验之栈与队列八:栈的基本操作
		
数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 堆栈是一种基本的数据结构.堆栈具 ...
 - SDUT-3334_数据结构实验之栈与队列七:出栈序列判定
		
数据结构实验之栈与队列七:出栈序列判定 Time Limit: 30 ms Memory Limit: 1000 KiB Problem Description 给一个初始的入栈序列,其次序即为元素的 ...
 - SDUT-3332&3333_数据结构实验之栈与队列五:下一较大值
		
数据结构实验之栈与队列六:下一较大值 Time Limit: 150 ms Memory Limit: 8000 KiB Problem Description 对于包含n(1<=n<=1 ...
 - SDUT-2134_数据结构实验之栈与队列四:括号匹配
		
数据结构实验之栈与队列四:括号匹配 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给你一串字符,不超过50个字符,可能 ...
 - SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式
		
数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...
 
随机推荐
- phpstudy安装好之后mysql无法启动(亲测可行)
			
安装好phpstudy后,Apache可以启动,Mysql无法启动. 尝试解决办法:可能是之前已经装过Mysql,要把系统服务里面的MySQL删除,留下MySQLa服务. 在cmd命令行下输入:sc ...
 - Kubernetes  基于 ubuntu18.04 手工部署 (k8s)
			
由于工作的需要, 手工部署一个 Kubernetes 环境(k8s).(以前都是云上搞定,拿来用) 习惯把这种工作记录下来,自己备查也和别人分享 网上相关文章很多, 我也参考了很多,这里推荐一个 链接 ...
 - Spring线程安全的实现机制--ThreadLocal
			
转载: http://blog.csdn.net/lufeng20/article/details/24314381
 - mysql向某个字段前边追加一个字符串CONCAT命令
			
比如,我在处理图片的时候把https写成了tps 那我就要补全 UPDATE t_article set imgs=CONCAT('ht',imgs);
 - python 关于如何把json文件里面的多条数据删除,只保留自己需要的条目
			
参考博客: https://www.cnblogs.com/bigberg/p/6430095.html https://zhidao.baidu.com/question/7173208338528 ...
 - python基--re模块的使用
			
正则表达式: 正则表达式本身是一种小型的.高度专业化的编程语言,然而在python中,通过内嵌集成re模块让调用者们可以直接调用来实现正则匹配.正则表达模式被变异成一系列的字节码,然后由C语言编写的 ...
 - vue 使用 element ui动态添加表单
			
html部分 <div class="hello"> <el-form :model="dynamicValidateForm" ref=&q ...
 - Leetcode641.Design Circular Deque设计循环双端队列
			
设计实现双端队列. 你的实现需要支持以下操作: MyCircularDeque(k):构造函数,双端队列的大小为k. insertFront():将一个元素添加到双端队列头部. 如果操作成功返回 tr ...
 - C++ 实现十大排序算法
			
教你手撕排序,这里有一个概念就是稳定排序.假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前, ...
 - jQuery 图片上传
			
1. 概述 1.1 说明 在一些前后端不分离的项目中,经常有一些需要把文件或者图片上传的功能,故记录此代码以便后期使用. 1.2 要求 1.上传,10M以内,限bmp,jpg,png,jpeg等图片格 ...