基础数据结构【五】————堆栈

DEMO1:堆栈的数组实现,循环控制元素压入或弹出操作,最后输出堆栈内元素

#include <iostream>
#include <iomanip>
#define MAXSTACK 100		//定义堆栈的最大容量
using namespace std;
int stack[MAXSTACK];		//声明用于堆栈操作的数组
int top=-1;				//堆栈的顶端
//判断是否为空堆栈
int isEmpty() 
{
    if(top==-1) return 1;
    else return 0;
}
//将指定的数据压入堆栈
int push(int data)
{
    if(top>=MAXSTACK)
    {
       cout<<"堆栈已满,无法再压入"<<endl;
       return 0; 
    }
    else
    {
       stack[++top]=data;		//将数据压入堆栈
       return 1;
        
    }
}
//从堆栈弹出数据
int pop()
{
    if(isEmpty())			//判断堆栈是否为空,如果是则返回-1
       return -1;
    else
       return stack[top--];	//将数据弹出后,再将堆栈指针往下移
}
//主程序
int main(void)
{
    int value;
    int i;
    cout<<"请按序输入10个数据:"<<endl;
    for(i=0;i<10;i++)
    {
       cin>>value;
       push(value);
    }
    cout<<"===================="<<endl;
    while(!isEmpty())		//将数据陆续从顶端弹出
       cout<<"堆栈弹出的顺序为:"<<setw(2)<<pop()<<endl; 
    cout<<"===================="<<endl;
    system("pause");      
    return 0; 
}

DEMO2:数组仿真扑克牌洗牌与发牌的全过程。随机数生成扑克牌后放入堆栈,满52张牌后开始发牌,使用堆栈给4人发发牌。

#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));
	for (i = 0; i < 52; i++)
		card[i] = i + 1;
	cout << "[洗牌中...请稍后!]" << endl;
	while (k < 30)
	{
		for (i = 0; i < 51; i++)
			for (j = i + 1; j < 52; j++)
				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;
}

 

。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大江东去浪淘尽千古风流人物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值