本文主要是介绍后缀表达式+栈的应用=四则表达式运算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<stack>
#define MAXLEN 100
using namespace std;
class Stack ///手写栈
{
public:
Stack()
{
top = -1;
}
int Pop();
int Push(char c);
char ReadTop();
bool Sempty();
int Size();
int top;
char s[MAXLEN];
};
int Stack::Pop()
{
if (Stack::Sempty())return 0;
else{
top--;
}
}
int Stack::Push(char c)
{
if (top == MAXLEN - 1)return 0;
else
{
top++;
s[top] = c;
return 1;
}
}
char Stack::ReadTop()
{
if (Stack::Sempty())return 0;
return s[top];
}
bool Stack::Sempty()
{
if (top==-1)
return true;
else return false;
}
int Stack::Size()
{
return top;
}
Stack s;
void Convertinto8(int d)
{
Stack sk;
int ba;
while(1)
{
if(d==0)break;
ba=d%8;
sk.Push((char)(ba+'0'));
d=d/8;
}
cout<<"八进制数字为:";
while(!sk.Sempty())
{
cout<<sk.ReadTop();
sk.Pop();
}
cout<<endl;
}
void Calculate()
{
Stack A,B;//A用来存符号 B用来存后缀表达式stack<int>C;///偷懒了一把,C用的是stl里的栈 计算后缀表的式的时候要用到C
char c[100];
cout<<"请输入表达式:"<<endl;
while(cin>>c)
{
int len=strlen(c);
for(int i=0;i<len;i++)
{
if(c[i]==' '){cout<<"error"<<endl;break;}
switch(c[i])
{
case '*':{if(!A.Sempty()){char k=A.ReadTop();if(k=='*'||k=='/'){
while(!A.Sempty())
{
char k=A.ReadTop();A.Pop();B.Push(k);
if(A.ReadTop()!='*'&&A.ReadTop()!='/')break;
}
} A.Push(c[i]);
}
else A.Push(c[i]);break;}
case '/':{if(!A.Sempty()){char k=A.ReadTop();if(k=='*'||k=='/'){
while(!A.Sempty())
{
char k=A.ReadTop();A.Pop();B.Push(k);
if(A.ReadTop()!='/'&&A.ReadTop()!='*')break;
}
} A.Push(c[i]);
}
else A.Push(c[i]);break;}
case '+':{if(!A.Sempty()){char k=A.ReadTop();if(k=='/'||k=='*')
{while(!A.Sempty()){char k=A.ReadTop();B.Push(k);A.Pop();}
A.Push(c[i]);}else A.Push(c[i]);}
else A.Push(c[i]);break;
}
case '-':{if(!A.Sempty()){char k=A.ReadTop();if(k=='/'||k=='*')
{while(!A.Sempty()){char k=A.ReadTop();B.Push(k);A.Pop();}
A.Push(c[i]);}
else if(k=='-'){char k=A.ReadTop();A.Pop();B.Push(k);A.Push(c[i]);}else A.Push(c[i]);}
else A.Push(c[i]);break;
}
case')':{while(!A.Sempty()&&A.ReadTop()!='('){char k=A.ReadTop();A.Pop();B.Push(k);}
A.Pop();break;
}
case '(':{A.Push(c[i]);break;}
default :{B.Push(c[i]);break;}
}
}
while(!A.Sempty())
{
char k;
k=A.ReadTop();
A.Pop();
B.Push(k);
}
char s1[100];
int length=B.Size();
for(int i=length;i>=0;i--)
{
s1[i]=B.ReadTop();
B.Pop();
}
int d1,d2;
for(int i=0;i<=length;i++)
{
int d=0;
if(s1[i]=='+'||s1[i]=='-'||s1[i]=='*'||s1[i]=='/')
{
d1=C.top();C.pop();
d2=C.top();C.pop();
switch(s1[i])
{
case'+':{d=d1+d2;break;}
case'-':{d=d2-d1;break;}
case'*':{d=d1*d2;break;}
case'/':{d=d2/d1;break;}
}
C.push(d);
}
else C.push((int)(s1[i]-'0'));
}
cout<<"结果为:";cout<<C.top()<<endl;
C.pop();
cout<<"请输入表达式:"<<endl;
}
}
int main()
{
int n;
cout<<"10进制转换成8进制,请输入10进制数字"<<endl;
cin>>n;
Convertinto8(n);
Calculate();
return 0;
}
这篇关于后缀表达式+栈的应用=四则表达式运算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!