舍友的数据结构作业,顺道学习
样例输入:一个波兰表达式,每个元素空格分隔,结束符为#。
orz(手模栈真ex!D区)好是我太菜了
注释写的比较多了
没毛病 就是一个纯粹的令人讨厌的模拟 stack不香?
总结&&发现:stack是真好使
从一篇大佬的博客上学到的新函数:atof() char数组转double型 好方便%%% 不过下面没有用
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define MAXSIZE 100///栈最大容量
using namespace std;
typedef struct
{
string *base;///栈底指针 string类型
string *top;///栈顶指针
int siz;///当前栈大小
int maxx;
} SqStack;
void Init(SqStack &S)///初始化
{
S.base=(string *)malloc(MAXSIZE*sizeof(string));
S.top=S.base;
S.maxx=MAXSIZE;
S.siz=0;///现在这个栈是空的
}
string GetTop(SqStack S)
{
string e;
e=*(S.top-1);
return e;
}
void Push(SqStack &S,string e)
{
*S.top=e;
S.top++;
S.siz++;
}
string Pop(SqStack &S)
{
string e;
e=*(S.top-1);
S.top--;
S.siz--;
return e;
}
string ntos(int a)
{
string s;
while(a)
{
int k=a%10;
char c=k+'0';
s=c+s;
a/=10;
}
return s;
}
int ston(string s)
{
int ans=0;
int len=s.size();
for(int i=0;i<len;i++)
{
ans=ans*10+s[i]-'0';
}
return ans;
}
int Operate(int tmp1,string c,int tmp2)
{
int ans=0;
switch(c[0])
{
case '+':ans=tmp1+tmp2;break;
case '-':ans=tmp1-tmp2;break;
case '*':ans=tmp1*tmp2;break;
case '/':ans=tmp1/tmp2;break;
}
return ans;
}
int main()
{
SqStack S;
Init(S);
string a,b,c;
cout<<"请输入波兰表达式"<<endl;
while(cin>>a)
{
if(a=="#")
break;
int len=a.size();
if(a[0]>='0'&&a[0]<='9'&&S.siz>=2)///该字符串是数字串&&栈内至少还有俩元素(一个数字串一个运算符),如果少于两个元素肯定不能进行运算,直接把它压入栈(else)
{
int tmp1=ston(a);
while(S.siz>=2)///比如- 2 * 3 1,算完了3*1后再算2-3,直到栈顶不是一个运算符和俩数字串相邻或栈内元素少于2个
{
b=Pop(S);///弹出一个元素
if(b[0]>='0'&&b[0]<='9')
{
int tmp2=ston(b);
string c=Pop(S);
tmp1=Operate(tmp2,c,tmp1);///如果b是个数字串的话,c一定是个运算符!否则该表达式没法算,不合法。所以不需要判断c是个什么东西,直接运算。注意运算顺序,后出栈的在前。
if(S.siz<2)///现在栈里少于两个元素,不需要在循环了
{
a=ntos(tmp1);///把刚才算出来的结果转化成字符串
Push(S,a);///压入栈
break;///这个循环告一段落,去处理新来的字符串
}
}
else///刚弹出的元素是个运算符,算不了
{
Push(S,b);///再把它放回去
Push(S,a);///刚才新来的字符串也需要放进去
break;///不能再算了,算不了,去处理新接收的字符串叭
}
}
}
else
Push(S,a);
}
///输入结束的同时,栈顶只会留有一个元素,就是结果
int ans=ston(GetTop(S));///记得转int嗷~
cout<<"表达式的值为"<<ans<<'\n';
return 0;
}
///- + 4 * 2 3 / 10 5 #
///- + 2 3 * 4 - 5 1 #