WEB开发网
开发学院软件开发C++ C++中的23种算法 阅读

C++中的23种算法

 2012-05-29 11:10:16 来源:WEB开发网   
核心提示:由堆叠中取出两个运算元进行对应的运算,然后将结果存回堆叠,C++中的23种算法(7),如果运算式读取完毕,那么堆叠顶的值就是答案了,取商数判断花色,取余数判断数字, 例如我们计算12+34+*这个运算式(也就是(1+2)*(3+4)):读取堆叠1 12 1 2+ 3 // 1+2 后存回3 3 34 3 3 4+ 3

由堆叠中取出两个运算元进

行对应的运算,然后将结果

存回堆叠,如果运算式读取

完毕,那么堆叠顶的值就是

答案了, 例如我们计算

12+34+*这个运算式(也就是

(1+2)*(3+4)):读取

堆叠

1 1

2 1 2

+ 3 // 1+2 后存回

3 3 3

4 3 3 4

+ 3 7 // 3+4 后存回

* 21 // 3 * 7 后存回

printf("输入后序式:");

scanf("%s", input);

evalPf(input);

return 0;

}

void evalPf(char* postfix) {

double stack[80] = {0.0};

char temp[2];

char token;

int top = 0, i = 0;

temp[1] = '\0';

while(1) {

token = postfix[i];

switch(token) {

case '\0':

printf("ans = %f\n", stack[top]);

return;

case '+': case '-': case '*': case '/':

stack[top-1] =

cal(stack[top], token, stack[top-1]);

top--;

break;

default:

if(top < sizeof(stack) / sizeof(float)) {

temp[0] = postfix[i];

top++;

stack[top] = atof(temp);

}

break;

}

i++;

}

}

double cal(double p1, char op, double p2) {

switch(op) {

case '+':

return p1 + p2;

case '-':

return p1 - p2;

case '*':

return p1 * p2;

case '/':

return p1 / p2;

}

}

10.洗扑克牌(乱数排列)

说明

洗扑克牌的原理其实与乱数排列是相同的,都是将一组数字(例如1~N)打乱重新排列,只

不过洗扑克牌多了一个花色判断的动作而已。

解法

初学者通常会直接想到,随机产生1~N的乱数并将之存入阵列中,后来产生的乱数存入阵列

前必须先检查阵列中是否已有重复的数字,如果有这个数就不存入,再重新产生下一个数,运

气不好的话,重复的次数就会很多,程式的执行速度就很慢了,这不是一个好方法。

以1~52的乱数排列为例好了,可以将阵列先依序由1到52填入,然后使用一个回圈走访阵列,

并随机产生1~52的乱数,将产生的乱数当作索引取出阵列值,并与目前阵列走访到的值相交换,

如此就不用担心乱数重复的问题了,阵列走访完毕后,所有的数字也就重新排列了。

至于如何判断花色?这只是除法的问题而已,取商数判断花色,取余数判断数字,您可以直接

看程式比较清楚。

实作

C

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define N 52

int main(void) {

int poker[N + 1];

int i, j, tmp, remain;

// 初始化阵列

for(i = 1; i <= N; i++)

poker[i] = i;

srand(time(0));

// 洗牌

for(i = 1; i <= N; i++) {

j = rand() % 52 + 1;

tmp = poker[i];

poker[i] = poker[j];

poker[j] = tmp;

}

for(i = 1; i <= N; i++) {

// 判断花色

switch((poker[i]-1) / 13) {

case 0:

printf("桃"); break;

case 1:

printf("心"); break;

case 2:

printf("砖"); break;

case 3:

printf("梅"); break;

}

// 扑克牌数字

remain = poker[i] % 13;

switch(remain) {

case 0:

printf("K "); break;

case 12:

printf("Q "); break;

case 11:

printf("J "); break;

上一页  2 3 4 5 6 7 8 9 10 11 12  下一页

Tags:算法

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接