求数据结构代码,可以追分,QQ:455107334
发布网友
发布时间:2022-05-26 09:35
我来回答
共5个回答
热心网友
时间:2023-10-11 09:01
//第四题
#include<iostream>
#include<string>
using namespace std;
#define MaxSize 100
typedef struct Stack
{
char list[MaxSize];
int count;
}DataType;
DataType Q;
char *first,*second;
int Count=0;
char Chuan[MaxSize];
void Initiate(DataType *x)
{
x->count=0;
}
bool isEmpty(DataType x)
{
if(x.count<=0) return true;
return false;
}
void Push(DataType *x,char m)
{
if(x->count>=MaxSize-1) {
cout<<"Error"<<endl;
return;
}
x->list[x->count]=m;
x->count++;
}
char Pop(DataType *x)
{
if(x->count<=0)
{cerr<<"error!"<<endl;}
--x->count;
return x->list[x->count];
}
char Peek(DataType x)
{
if(x.count<=0)
{cerr<<"error!"<<endl;}
return x.list[x.count-1];
}
void Try()
{
if(*second=='\0')
{
for(int i=0;i<Count;i++)
cout<<Chuan[i]<<" ";
cout<<endl;
}
if(*first!='\0')
{
Push(&Q,*first);
Chuan[Count++]='i';
++first;
Try();
Pop(&Q);
--Count;
--first;
}
if(!isEmpty(Q)){ //还原!!!!!
char c=Peek(Q);
if(c==*second)
{
Pop(&Q);
Chuan[Count++]='o';
++second;
Try();
Push(&Q,c);
--Count;
--second;
}
}
}
int main()
{
string x1,x2;
while(cin>>x1>>x2)
{
first=(char*)(x1.c_str());
second=(char*)(x2.c_str());
// cout<<"["<<endl;
Try();
// cout<<"]"<<endl;
}
return 0;
}
//第五题
#include<stdio.h>
struct
{
int op;
double num;
}ret[200];
int topa,topb;
int opstk[200];
int level[200];
double cal(double a,double b,char op)
{
if(op=='+')
return a+b;
if(op=='-')
return a-b;
if(op=='*')
return a*b;
if(op=='/')
return a/b;
}
int main()
{
int i,temp,sign,j,x,y;
char s[200];
level['+']=level['-']=0;
level['*']=level['/']=1;
level['(']=level[')']=2;
while(scanf("%s",s)!=EOF)
{
topa=topb=0;
for(i=0;s[i];i++)
{
if(s[i]=='(')
{
opstk[topa++]='(';
}
else if(s[i]==')')
{
while(topa>0&&opstk[topa-1]!='(')
{
topa--;
ret[topb++].op=opstk[topa];
}
topa--;
}
else if(s[i]=='+'||s[i]=='*'||s[i]=='/')
{
while(topa>0&&opstk[topa-1]!='('&&level[opstk[topa-1]]>=level[s[i]])
{
topa--;
ret[topb++].op=opstk[topa];
}
opstk[topa++]=s[i];
}
else if(s[i]=='-')
{
if((i>0&&s[i-1]=='(')||i==0)
{
sign=-1;
temp=0;
for(j=i+1;s[j]&&s[j]>='0'&&s[j]<='9';j++)
temp=temp*10+s[j]-'0';
ret[topb].op=-1;
ret[topb++].num=sign*temp;
i=j-1;
}
else
{
while(topa>0&&opstk[topa-1]!='('&&level[opstk[topa-1]]>=level['-'])
{
topa--;
ret[topb++].op=opstk[topa];
}
opstk[topa++]='-';
}
}
else if(s[i]>='0'&&s[i]<='9')
{
temp=0;
for(j=i;s[j]&&s[j]>='0'&&s[j]<='9';j++)
temp=temp*10+s[j]-'0';
ret[topb].op=-1;
ret[topb++].num=temp;
i=j-1;
}
}
while(topa>0)
{
topa--;
ret[topb++].op=opstk[topa];
}
for(i=0;i<topb;i++)
{
if(ret[i].op=='+'||ret[i].op=='-'||ret[i].op=='*'||ret[i].op=='/')
{
for(y=i-1;y>=0;y--)
if(ret[y].op==-1)
break;
for(x=y-1;x>=0;x--)
if(ret[x].op==-1)
break;
ret[i].num=cal(ret[x].num,ret[y].num,ret[i].op);
ret[i].op=-1;
ret[x].op=0;
ret[y].op=0;
}
}
printf("%.4lf\n",ret[topb-1].num);
}
return 0;
}
热心网友
时间:2023-10-11 09:02
自己以前写的一个计算表达式你看看吧,现在没时间
#include<iostream>
#include<string>
using namespace std;
enum error_code{overflow,underflow,success};
template<class T>
class stack
{
public:
stack(){count=0;};
T get_top()
{
x=data[count-1];
return x;
}
error_code push( T x)
{
data[count]=x;
count++;
return success;
}
error_code pop()
{
count--;
return success;
}
private:
T x;
int count;
T data[10];
};
//判断是否字符
int in(char m)
{
if(m=='+'||m=='-'||m=='*'||m=='/'||m=='('||m==')'||m=='#'||m=='\0')return 1;
else return 0;
}
//比较优先级
char precede(char m,char n)
{
if(m=='#')return '<';
else if(n=='#')return'>';
else if (m=='('&&n==')')return '=';
else if(m=='(')return '<';
else if(n=='(')return '<';
else if(n==')')return '>';
else if(m=='*')return '>';
else if(m=='/')return '>';
else if((m=='+'||m=='-')&&(n=='+'||n=='-'))return '>';
else return '<';
}
//出栈之后进行的二元运算
int operate(int a,char b,int c)
{
switch(b)
{
case'+':return a+c;break;
case'-':return a-c;break;
case'*':return a*c;break;
case'/':return a/c;break;
default:return 0;
}
}
void main()
{
string ch;
stack<int> D;
stack<char> R;
int j,k=0,d,e,f,g;
char p,q;
cout<<"以#号键开头并以#号键结束输入表达式"<<endl;
cin>>ch;
R.push('#');
for(j=1;ch[j]!='\0';j++)
{
if(!in(ch[j])&&in(ch[j-1]))
{
k=(int)(ch[j])-48;
if(in(ch[j+1]))D.push(k);
}
else if(!in(ch[j]))
{
k=k*10+(int)(ch[j])-48;
if(in(ch[j+1]))D.push(k);
}
else
{
p=R.get_top();
switch(precede(p,ch[j]))
{
case'<':R.push(ch[j]);
break;
case'>':R.pop();
e=D.get_top();D.pop();
d=D.get_top();D.pop();
f=operate(d,p,e);
D.push(f);
q=R.get_top();
switch(precede(q,ch[j]))
{
case'>':R.pop();
e=D.get_top();D.pop();
d=D.get_top();D.pop();
f=operate(d,q,e);
D.push(f);
if(ch[j]==')')R.pop();
else R.push(ch[j]);
break;
case'<':R.push(ch[j]);
break;
case'=':R.pop();
break;
}
break;
case'=':R.pop();
break;
}
}
}
g=D.get_top();D.pop();
cout<<"="<<g<<endl;
}追问输出结果不对啊
追答我在VS2008和vc6.0上运行都没问题。什么结果不对,说下
热心网友
时间:2023-10-11 09:02
小赟同学…… 发现你了追问你...你 who r u?
热心网友
时间:2023-10-11 09:03
嘿嘿 你让文!强哥情何以康
热心网友
时间:2023-10-11 09:04
*哥不缺那点分啊