首页 > 其他分享 >数据结构实验之栈二:一般算术表达式转换成后缀式(手写栈)

数据结构实验之栈二:一般算术表达式转换成后缀式(手写栈)

时间:2022-11-18 16:41:47浏览次数:48  
标签:括弧 后缀 top 之栈 pop break base && 数据结构


数据结构实验之栈二:一般算术表达式转换成后缀式

Time Limit: 1000MS Memory limit: 65536K

题目描述

对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。

输入

输入一个算术表达式,以‘#’字符作为结束标志。

输出

输出该表达式转换所得到的后缀式。

示例输入

a*b+(c-d/e)*f#

示例输出

ab*cde/-f*+


解析: 其实对于栈的操作,大家更喜欢用stl,但是手写栈也是很重要的,可以让我们了解栈的内部操作;
对于这个题来说不用栈也行,用树的后序遍历更好。
讲一下核心内容:(1)、遇到字母一律输出;
(2)、遇到左括弧一律入栈;
(3)、遇到右括弧就把两个括弧之间的所有符号出栈输出,并且左括弧出栈;
(4)、遇到“+”或“-”,如果栈不空并且栈顶不是左括弧就出栈输出这一个栈顶,“+”或“-”入栈;
(5)、遇到“*”或“/”,如果栈不空并且栈顶不是左括弧并且栈顶是“*”或“/”,就把栈顶出栈输出,“*”或“/”入栈;
这是操作步骤,想问“+”、“-”、“*”、“/”为什么操作不一样,那就是符号优先级的问题了。
///***********代码
#include <stdio.h>  
#include <stdlib.h>
#define maxstact 1000

typedef char elemstack;
typedef struct
{
elemstack *top;
elemstack *base;
int sizestack;
} Sq;
int initstack(Sq &L)
{
L.base=new elemstack[maxstact];
if(!L.base)
exit(0);
L.top=L.base;
L.sizestack=maxstact;
}
int push(Sq &L,char s)
{
if(L.top-L.base>L.sizestack)
return -1;
*(L.top++)=s;
return 0;
}
int pop(Sq &L)
{
if(L.top<=L.base)
return -1;
printf("%c",*(--L.top));
}
int main()
{
Sq L;
char a[1000],*s;
int i;
gets(a);
initstack(L);
for(i=0; a[i]!='#'; i++)
{
switch(a[i])
{
case '(':
push(L,a[i]);
break;
case ')':
{
while(L.top>L.base&&*(L.top-1)!='(')
pop(L);
L.top--;
break;
}
case '+':
{
if(L.top>L.base&&*(L.top-1)!='(')
pop(L);
push(L,a[i]);
break;
}
case '-':
{
if(L.top>L.base&&*(L.top-1)!='(')
pop(L);
push(L,a[i]);
break;
}
case '*':
{
if(L.top>L.base&&*(L.top-1)!='('&&(*(L.top-1)=='*'||*(L.top-1)=='/'))
pop(L);
push(L,a[i]);
break;
}
case '/':
{
if(L.top>L.base&&*(L.top-1)!='('&&(*(L.top-1)=='*'||*(L.top-1)=='/'))
pop(L);
push(L,a[i]);
break;
}
default:
{
printf("%c",a[i]);
break;
}
}
}
while(L.top>L.base)
{
pop(L);
}
return 0;
}

 

标签:括弧,后缀,top,之栈,pop,break,base,&&,数据结构
From: https://blog.51cto.com/u_15879559/5868802

相关文章

  • redis五种数据结构详解
    5.相关介绍和命令5.redis是单线程+多路io复用技术 多路复用是指使用一个线程来检查多个文件描述符的就绪状态,比如调用select和poll函数,传入多个文件毛舒服,如果有一个文......
  • 基础数据结构 -链表
    链表描述:内存中内部的存储方式,通常情况下可以认为是多个节点存储一串的的结构链表存储结构数据域Datafield指针域pointerfield......
  • 【线性表】之栈(C语言)
    栈​​回顾​​​​栈​​​​结构定义​​​​初始化​​​​销毁​​​​入栈​​​​出栈​​​​返回栈顶元素​​​​返回栈中元素个数​​​​判断栈是否为空​​​​......
  • 《大话数据结构》线性表代码总结
    //线性表存储的结构代码#include<stdio.h>#include<stdlib.h>#include<time.h>#defineMAXSIZE1000//静态链表部分的#defineMAX_SIZE20//最大长度#defineOK1#defineER......
  • 《大话数据结构》栈-代码汇总
    //栈的结构定义//元素下标同数组从0开始//***************************#include<stdio.h>#include<stdlib.h>#include<time.h>#defineMAXSIZE1000#defineMAX_SIZE20#de......
  • 《大话数据结构》队列代码汇总
    //队列#include<stdio.h>#include<stdlib.h>#include<time.h>#defineMAXSIZE1000#defineMAX_SIZE20#defineOK1#defineERROR0#defineTRUE1#defineFALSE0//******......
  • 数据结构-树-流程图
    根据《大话数据结构》......
  • 数据结构基础—树与二叉树(1)
    数据结构基础—树和二叉树一、树、二叉树类型定义1.树的定义a.定义树是一种非线性结构,是具有相同特征的数据元素的集合(同质/类)数据对象D:D是具有相同特征的数据元......
  • 数据结构篇——栈和队列
    数据结构篇——栈和队列本次我们介绍基础算法中的栈和队列,我们会从下面几个角度来介绍:栈和队列简述模拟栈模拟队列栈和队列简述首先我们要简单了解一下栈和队列:......
  • 数组模拟各类数据结构
    数组模拟各类数据结构 Hash(散列)  并查集   Trie树 堆映射版本堆,Dijkstra需要用到 堆排序  链表  栈与队列......