大神们,过来改错了。利用栈的逆波兰表达式的24点游戏

发布于 2021-12-02 03:40:13 字数 2625 浏览 838 评论 2

     给定4张扑克牌,【1-10】;
    用加减乘除计算出24 

#include<iostream>
#include<string>
#include<cstring>
#include<cstdlib>
//#include<cstdio>
#include<exception>
#include<stack>
using namespace std;
string rand_op()
{
	int n=int(rand()/double(RAND_MAX)*4);//[0,1]
	//0-1,1-2,2-3,3-4
	//cout<<n<<"  ";
	if(n==0) return "+";
	else if(n==1) return "-";
	else if(n==2) return "*";
	else return "/"; 
}
void shuffle(string* ss)
{
	/*
	int n=0;
	cout<<n;
	for(int j=0;!ss[j].empty();j++){
		n++;
	}
	cout<<n;
	*/
	for(int i=0;i<7;i++)
	{
		int k=int(rand()/double(RAND_MAX)*7);
		string str=ss[i];
		ss[i]=ss[k];
		ss[k]=str;
	}
}
int op(int a,int b,string oper)
{
	char ch='A';
	cout<<"check--op";
	int sum;
	if(oper=="+") sum=a+b;
	else if(oper=="-") sum=a-b;
	else if(oper=="*") sum=a*b;
	else {
		if(a%b != 0){
			//throw new exception("not/");
			throw ch;
		} 
		else sum=a/b;
	}
	return sum;
	
}
int ji_suan(string* ss)
{
	stack<string>stk; 
	/*测试注释
	for(int j=0;j<7;j++)
	{
		stk.push(ss[j]);
		cout<<ss[j]<<" ";
	}
	cout<<endl;
	while(!stk.empty())
	{
		string str=stk.top();
		cout<<str<<" ";
		stk.pop();
	}
	cout<<endl;
	*/
	
	try{
		for(int i=0;i<7;i++)
		{
			if(ss[i]=="+" || ss[i]=="-" || ss[i]=="*" || ss[i]=="/" ){
				//cout<<"check "; 
				//cout<<stk.top();
				int a=atoi(stk.top().c_str());
				stk.pop();
				//cout<<stk.top();
				int b=atoi(stk.top().c_str());
				stk.pop();
				stk.push( op(a,b,ss[i])+" " );
			}else{
				stk.push(ss[i]);
			}
		}
	}
	catch(char){
		return 0;
	}
	if(stk.size()==1 && stk.top()=="24") return 1;
	else return 0;
	
}
void show(string *ss)
{
	stack<string>stk;
	for(int i=0;i<7;i++)
	{
		if(ss[i]=="+" || ss[i]=="-" || ss[i]=="*" || ss[i]=="/" ){
			string str1=stk.top();
			stk.pop();
			string str2=stk.top();
			stk.pop();
			stk.push("(" +str1+ss[i]+str2+" )");
		}else{
			stk.push(ss[i]);
		}
	}
}
void f(string* ss)
{
	//随机产生组合序列,计算结果为24返回结果
	//逆波兰表达式 
	for(int k=0;k<10;k++)
	{
		int i;
		string* buf=new string[7];
		for( i=0;i<4;i++) buf[i]=ss[i];
		for( i=4;i<7;i++) buf[i]=rand_op();
		shuffle(buf);//洗牌,不能用next_permutation 
		//char ch;
		//ch=getchar();
		if(ji_suan(buf)==1){
			cout<<"ok"<<endl;
			show(buf);
		}
	} 
}

int main()
{
	while(1){
		cout<<"输入4个整数:  ";
		string * x =new string[4]; 
		for(int i=0;i<4;i++){
			cin>>x[i];
		} 
		f(x);
	}
	return 0;
} 

 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

无法言说的痛 2021-12-04 07:52:36

这并不是家庭作业~~~

本宫微胖 2021-12-04 00:18:47

又是把家庭作业拿上来让别人帮忙的,而且还是直接贴代码的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文