求数据结构代码,可以追分,QQ:455107334

4.栈(z1004)
栈是一种重要的数据结构,具有后进先出的特性,它的两个重要操作是进栈和出栈,这里用i代表入栈,o代表出栈。对于给定的一个单词,通过一连串的栈操作颠倒字母间的顺序可以构造出另一个单词。例如,这里有两组连续的栈操作,它们都可以将TROT转换成TORT:
i i i i o o o o
i o i i o o i o
现在给你一对单词,你的程序应该可以通过一系列的栈操作把第一个单词转换成第二个单词。
键盘输入两个单词,第一行为源单词,第二行为目标单词,设计算法并编写程序输出所有可能的将源单词转换为目标单词的栈操作序列(由i和o组成的序列),如果不存在这样的序列输出“无”。
测试数据1:若输入
madam
adamm
则输出:i i i i o o o i o o
i i i i o o o o i o
i i o i o i o i o o
i i o i o i o o i o
测试数据2:若输入
bahama
bahama
则输出:i o i i i o o i i o o o
i o i i i o o o i o i o
i o i o i o i i i o o o
i o i o i o i o i o i o
测试数据3:若输入
long
short
则输出:无
测试数据4:若输入
eric
rice
则输出:i i o i o i o o
5、算术表达式求值问题
问题描述:根据算术运算符的优先级,根据输入的算术表达式,求表达式的值。
例如,输入的算术表达式形式为:12+32*4, 3*(12+24/(2+4)), 3.6*(4.3+5)
6.马踏棋盘问题(要求,设计算法为非递归算法)
设计问题:有一个8*8的方格棋盘(如下图所示),现有一匹马从任意一个位置(方格)出发,给出一种方案使马走遍棋盘中的每一个方格,且每个方格只走过一次(马走日字)。
程序的输入:输入马的初始位置(相应的坐标)。
程序的输出:马从初始位置走遍棋盘的过程

7.文本编辑
功能:从键盘输入一页文字,静态存储在一个文件中
要求:(1)分别统计出其中英文字母数和空格数及整篇文章总字数;
(2)统计某一字符串在文章中出现的次数,并输出该次数;
(3)删除某一子串,并将后面的字符前移。
   (4)存储结构使用线性表,分别用几个子函数实现相应的功能;
输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。
输出形式:
(1)分行输出用户输入的各行字符;
(2)分行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"
(3)输出删除某一字符串后的文章;
只要其中两题代码就行,跪求

//第四题
#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;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-17
自己以前写的一个计算表达式你看看吧,现在没时间
#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上运行都没问题。什么结果不对,说下

第2个回答  2011-12-12
小赟同学…… 发现你了追问

你...你 who r u?

第3个回答  2011-12-19
嘿嘿 你让文!强哥情何以康
第4个回答  2011-12-21
文强哥不缺那点分啊
相似回答