#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; //将从堆栈取出的数据返回给主程序
}
}