数组实现堆栈完成扑克洗牌发牌过程

#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstdlib>

using namespace std;
void Swap(int*,int*);
void push(int statck[],int MAX,int val);
int pop(int stack[]);
int top=-1;
int main(void)
{  
	int card[52],stack[52]={0};
	int i,j,k=0, ascVal;
	char suit[4][10]={"草花","方块","红桃","黑桃"};
	int style;
//只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟。如果想在一个程序中生成随机数序列,
//需要至多在生成随机数之前设置一次随机种子。
// 即:只需在主程序开始处调用srand((unsigned)time(NULL)); 后面直接用rand就可以了。
//不要在for等循环放置srand((unsigned)time(NULL));
	srand((unsigned)time(NULL));
	for (i=0;i<52;i++)
		card[i]=i+1;
//card[i]里边存了牌的序号
	cout<<"[洗牌中...请稍后!]"<<endl;
//洗牌操作
	while(k<30)
	{
		for(i=0;i<51;i++)
			for(j=i+1;j<52;j++)
//求余数,54张牌任意交换位置
			if(rand()%52==2)
					Swap(&card[i],&card[j]);//洗牌
		k++;
	}
	i=0;
	while(i!=52)
	{
		push(stack,52,card[i]);//将52张牌压入堆栈
		i++;
	}
	cout<<"[逆时针发牌]"<<endl;
	cout<<"[显示各家拿到的牌]"<<endl;
 	cout<<"\t\t东家\t 北家\t 西家\t 南家"<<endl;
	cout<<"========================================================="<<endl;
	while (top >=0)
	{  
		style = stack[top]/13;	//计算扑克牌的花色
		switch(style)			//扑克牌花色对应的图标
		{
			case 0:			//梅花
				ascVal=0;
				break;
			case 1:			//方块
				ascVal=1;
				break;
			case 2:			//红心
				ascVal=2;
				break;
			case 3:			//黑桃
				ascVal=3;
				break;
		}
		cout<<"["<<suit[ascVal]<<setw(3)<<stack[top]%13+1<<"]\t";
		if(top%4==0)
			cout<<endl;
		top--;
	}
	system("pause");      
    return 0;
}
void push(int stack[],int MAX,int val)
{
	if(top>=MAX-1)
		cout<<"[堆栈已经满了]"<<endl;
	else
	{
		top++;
		stack[top]=val;
	}
}
int pop(int stack[])
{
	if(top<0)
		cout<<"[堆栈已经空了]"<<endl;
	else
		top--;
	return stack[top];
}
void Swap(int* a,int* b)
{
	int temp;
	temp=*a;
	*a=*b;
	*b=temp;
}

核心代码模块:


//栈顶为stack[Max-1],栈底为stack[0]
void push(int stack[],int MAX,int val)
{
	if(top>=MAX-1)
		cout<<"[堆栈已经满了]"<<endl;
	else
	{
		top++;
		stack[top]=val;
	}
}
int pop(int stack[])
{
	if(top<0)
		cout<<"[堆栈已经空了]"<<endl;
	else
		top--;
	return stack[top];
}

链表实现堆栈核心代码

using namespace std;
class Node	//声明堆栈链表节点
{
   public:
   int data;	//声明存放堆栈数据的变量
   class Node *next;	//堆栈中用来指向下一个节点的指针
};
typedef class Node Stack_Node;		//定义堆栈中节点的新类型,Node是一个类型,相当于int,此处定 
                                    //义一个新类型,stack_Node也就具有了Node的属性
typedef Stack_Node *Linked_Stack;	//定义链表堆栈的新类型,此处Stack_Node *是一个指针类型, 
                                    //相当于int*,此处Linked_Stack便有了Node*的属性
Linked_Stack top=NULL;				//指向堆栈顶端的指针
//可根据top的值判断堆栈的状态
//判断是否为空堆栈
int isEmpty()
{
    if(top==NULL) return 1;
    else return 0;
}
//将指定的数据压入堆栈
void push(int data)
{
    Linked_Stack new_add_node;	//新加入节点的指针
    //分配内存给新节点
    new_add_node=new Stack_Node;   //Test* pTest = new Test()
    new_add_node->data=data;		//将传入的值赋值给节点的数据变量
    new_add_node->next=top;		//将新节点指向堆栈的顶端,top是一个栈顶指针
    top=new_add_node;			//新节点成为堆栈的顶端
}
//从堆栈弹出数据
int pop()
{
    Linked_Stack ptr;		//指向堆栈顶端的指针
    int temp;
    if(isEmpty())			//判断堆栈是否为空,如果是则返回-1
    {
       cout<<"===目前为空堆栈==="<<endl;
       return -1;
    }
    else
    {
        ptr=top;		//指向堆栈的顶端
        top=top->next;	//将堆栈顶端的指针指向下一个节点,让top保持在链表最后面
        temp=ptr->data;	//取出堆栈的数据
        free(ptr);			//将节点占用的内存释放
        return temp;		//将从堆栈取出的数据返回给主程序
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中,可以使用数组实现堆栈。下面是一个基于数组存储的堆栈实现代码示例: ```c #define MAXSIZE 100 //定义栈的最大容量 typedef struct{ int data[MAXSIZE]; //存储数据的数组 int top; //栈顶指针 }Stack; //初始化栈 void InitStack(Stack *s){ s->top = -1; //栈顶指针设为-1,表示栈为空 } //判断栈是否为空 int StackEmpty(Stack *s){ if(s->top == -1){ return 1; //栈为空 } else{ return 0; //栈不为空 } } //入栈操作 int Push(Stack *s, int x){ if(s->top == MAXSIZE - 1){ //栈已满,无法入栈 return 0; } else{ s->top++; //栈顶指针加1 s->data[s->top] = x; //将元素x入栈 return 1; } } //出栈操作 int Pop(Stack *s, int *x){ if(StackEmpty(s)){ //栈为空,无法出栈 return 0; } else{ *x = s->data[s->top]; //取出栈顶元素 s->top--; //栈顶指针减1 return 1; } } //获取栈顶元素 int GetTop(Stack *s, int *x){ if(StackEmpty(s)){ //栈为空,无法获取栈顶元素 return 0; } else{ *x = s->data[s->top]; //取出栈顶元素 return 1; } } ``` 上述代码中,定义了一个结构体Stack,其中包括一个数组data和一个栈顶指针top。在初始化栈时,将栈顶指针设为-1,表示栈为空。入栈操作时,首先判断栈是否已满,如果未满则将元素x插入到栈顶,并将栈顶指针加1;出栈操作时,首先判断栈是否为空,如果不为空则取出栈顶元素,并将栈顶指针减1;获取栈顶元素时,也需要判断栈是否为空,如果不为空则取出栈顶元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值