数据结构学习(四)

栈和队列

用链表实现栈

typedef struct zhan
{
	int val;
	struct zhan* next;
};

初始化

zhan* initzhan()
{
	zhan* head = (zhan*)malloc(sizeof(zhan));
	head->val = 1;
	head->next = NULL;

	zhan* temp = head;

	for (int i = 2; i < 5; i++)
	{
		zhan* a = (zhan*)malloc(sizeof(zhan));
		a->val = i;
		a->next = NULL;

		temp->next = a;
		temp = a;
	}
	return head;
}

打印

void printzhan(zhan* z)
{
	zhan* temp = z;
	while (temp != NULL)
	{
		cout << temp->val << endl;
		temp = temp->next;
	}
}

入栈

zhan* ruzhan(zhan* z,int val)
{
	zhan* nz = (zhan*)malloc(sizeof(zhan));

	nz->val = val;
	nz->next = z;

	return nz;
}

出栈

zhan* chuzhan(zhan* z)
{
	zhan* temp = z->next;
	z->next = NULL;

	return temp;
}

用链表实现队列

typedef struct dl
{
	int val;
	struct dl* next;
};

队列初始化

dl* initdl()
{
	dl* head = (dl*)malloc(sizeof(dl));
	head->val = 1;
	head->next = NULL;
	dl* temp = head;

	for (int i = 2; i < 5; i++)
	{
		dl* a = (dl*)malloc(sizeof(dl));
		a->val = i;
		a->next = NULL;

		temp->next = a;
		temp = a;
	}
	return head;
}

队列打印

void printdl(dl* d)
{
	dl* temp = d;
	while (temp != NULL)
	{
		cout << temp->val << endl;
		temp = temp->next;
	}
}

入队

dl* rudui(dl* d, int val)
{
	dl* a = (dl*)malloc(sizeof(dl));
	a->val = val;
	a->next = d;

	return a;
}

出队

dl* chudui(dl* d)
{
	dl* temp = d;
	while (temp->next->next != NULL)
	{
		temp = temp->next;
	}
	temp->next = NULL;

	return d;
}

栈 实现全进制转换(2-36进制互转)

stack.h

//栈实现 进制转换
//顺序栈
#define MAX_SIZE 100
typedef struct stack
{
	int* top;
	int* end;
	int size;
};

void initstack(stack& s);
void insertstack(stack& s,int val);
int pushstack(stack& s);
stack zh(stack s,char* num, int num_jz, int to_jz);

stack.cpp

void initstack(stack& s)
{
	s.end = new int[MAX_SIZE];
	s.top = s.end;
	s.size = MAX_SIZE;
}

void insertstack(stack& s,int val)
{
	if (s.top - s.end == s.size)
	{
		cout << "full" << endl;
		exit;
	}
	else
	{
		*s.top = val;
		s.top++;
	}
}

int pushstack(stack& s)
{
	if (s.top == s.end)
	{
		cout << "empty" << endl;
		exit;
	}
	else
	{
		int e = *(s.top - 1);
		s.top--;
		return e;
	}
}

int to_10(char* data, int num_jz)
{
	int x = 0,temp;
	int k = (int)strlen(data)-1;
	for (int i = k; i >=0 ; i--)
	{
		if (data[i] >= 48 && data[i] <= 57) { //0-9
			temp = data[i] - 48;
		}
		else {
			temp = data[i] - 55;  //A-Z的ASCII码值65-90,所以减55变成10-35
		}
		x += temp * pow(num_jz,k-i);
	}
	return x;
}

stack zh(stack s,char* num,int num_jz, int to_jz)
{
	int x = to_10(num, num_jz);
	//cout << x;
	while (x / to_jz)
	{	
		int x1 = x % to_jz;
		//cout << x1 << endl;
		insertstack(s, x1);
		x /= to_jz;
	}
	insertstack(s, x);
	return s;
}

main.cpp

    stack s;
	initstack(s);
	char str[100] = {0};
	cout << "num:";
	cin >> str;
	int num_jz;
	cout << "num 进制:";
	cin >> num_jz;
	int to_jz;
	cout << "转换进制:";
	cin >> to_jz;
	s = zh(s, str, num_jz, to_jz);
	int len = s.top - s.end;
	for (int i = 0; i < len; i++)
	{
		int e = pushstack(s);
		if (e>=10) {
			char a = char(e + 55);
			cout << a;
		}
		else {
			cout << e;
		}
		
	}

用栈结构进行括号匹配

void initstack(cstack& s)
{
	s.end = new char[MAX_SIZE];
	s.top = s.end;
	s.size = MAX_SIZE;
}

void insertstack(cstack& s, char val)
{
	if (s.top - s.end == s.size)
	{
		cout << "full" << endl;
		exit;
	}
	else 
	{
		*s.top = val;
		s.top++;
	}

}

char pushstack(cstack& s)
{
	if (s.top == s.end)
	{
		cout << "empty" << endl;
		exit;
	}
	int e = *(s.top - 1);
	s.top--;
	return e;
}

int khpp(char* c)
{
	cstack s;
	initstack(s);
	int k = (int)strlen(c);
	for (int i = 0; i < k; i++)
	{
		if (c[i] == '(' || c[i] == '{' || c[i] == '[')
		{
			insertstack(s, c[i]);
		}
		if (c[i] == ')' || c[i] == '}' || c[i] == ']')
		{
			char a = pushstack(s);
			
			if ((a == '(' && c[i] == ')') || (a == '{' && c[i] == '}') || (a == '[' && c[i] == ']'))
			{
				continue;
			}
			else
			{
				return 0;
			}
		}
	}

	if (s.top == s.end)
	{
		return 1;
	}
	else
	{
		return 0;
	}

}

c语言游戏代码_[数据结构实践项目]扑克牌游戏

如果打出的牌与桌上某张牌的数字相等,即可将两张相同的牌以及两张中间所夹的所有的牌全部取走,每次取走的一小摞牌都必须放到自己本摞的下面。游戏过程中,一旦有人手中没有牌,则宣布另一人获胜,同时游戏结束。

#include <iostream>
#include "stop.h"
#include <ctime>
using namespace std;
#define max_size 52
#define desk_max_size 100000
void print(player p)
{
	while (p.end != p.top)
	{
		p.top--;
		int c = *p.top;
		cout << c << " ";
	}
	cout << endl;
}

void insertp(player& p, int val)
{
	*p.top = val;
	p.top++;
}

int pushplayer(player& p)
{
	if (p.top == p.end)
	{
		cout << "empty" << endl;
		exit;
	}
	else
	{	
		int e = *(p.top - 1);
		p.top--;
		return e;
	}

}

void initzsp1(player& p1, player& p2)  //fapai
{
	p1.end = new int[max_size];
	p1.top = p1.end;
	p1.size = max_size;
	p2.end = new int[max_size];
	p2.top = p2.end;
	p2.size = max_size;

	int full1 = 0, full2 = 0;

	for (int i = 0; i < 4; i++)
	{
		for (int j = 1; j <= 13; j++)
		{
			int x = rand() % 2;
			if (full1 == 0 && full2 == 1)
			{
				insertp(p1, j);
			}
			if (full1 == 1 && full2 == 0)
			{
				insertp(p2, j);
			}
			if (full1 == 0 && full2 == 0)
			{
				//cout << x;
				if (x == 0) { insertp(p1, j); }
				if (x == 1) { insertp(p2, j); }
				if (p1.top - p1.end == 26)
				{
					full1 = 1;
				}
				if (p2.top - p2.end == 26)
				{
					full2 = 1;
				}
			}
		}
	}
}

void initdesk(desk& d)
{
	d.end = new int[desk_max_size];
	d.top = d.end;
	//d.gtop = d.end;
	d.tsize = 0;
	d.esize = 0;
}

void insertdesk(desk& d,int val)
{
	*d.top = val;
	d.tsize++;
	//if (d.tsize % max_size == 0)
	//{
	//	d.top = d.gtop;
	//}
	//else
	//{
	//	d.top++;
	//}
	d.top++;

}

int pushdesk(desk& d)
{
	int e = *d.end;
	d.esize++;
	//if (d.esize % max_size == 0)
	//{
	//	d.end = d.gtop;
	//}
	//else
	//{
	//	d.end++;
	//}
	d.end++;
	return e;
}

void printd(desk p)
{
	while (p.end != p.top)
	{
		p.top--;
		int c = *p.top;
		cout << c << " ";
	}
}

int chupai()
{
	int pl1 = 1, pl2 = 0;
	int flag = 0;
	int first;
	desk d;
	initdesk(d);
	player p1, p2;
	initzsp1(p1, p2);
	print(p1);
	print(p2);
	while ((p1.top != p1.end) && (p2.top != p2.end))
	{
		print(p1);
		print(p2);
		flag = 0;
		if (pl1 == 1 && flag == 0)
		{
			first = pushplayer(p1);
			//cout << first << endl;
			insertdesk(d, first);
			insertdesk(d, pushplayer(p2));
			//printd(d);
			//cout << *(d.top-1);
			while (first != *(d.top-1)) //偶数牌 p2y
			{	
				insertdesk(d, pushplayer(p1));
				cout << first << " " << *(d.top - 1) << endl;
				if ( first == *(d.top - 1) || p1.top == p1.end) break;
				insertdesk(d, pushplayer(p2));
				cout << first << " " << *(d.top - 1) << endl;
				if (p2.top == p2.end) break;
			}
			int num = d.tsize - d.esize;
			if (num % 2 == 0) //2
			{
				while (d.top != d.end)
				{
					insertp(p2, pushdesk(d));
				}
				cout<<"2号收牌"<<endl;
				pl2 = 1;
				pl1 = 0;
				flag = 1;
			}
			else
			{
				while (d.top != d.end)
				{
					insertp(p1, pushdesk(d));
				}
				cout << "1号收牌" << endl;
				pl2 = 0;
				pl1 = 1;
				flag = 1;
			}
		}
		if (pl2 == 1 && flag == 0)
		{
			first = pushplayer(p2);
			insertdesk(d, first);
			insertdesk(d, pushplayer(p1));
			while (first != *(d.top - 1)) //偶数牌 p1y
			{
				insertdesk(d, pushplayer(p2));
				cout << first << " " << *(d.top - 1) << endl;
				if (first == *(d.top - 1) || p2.top == p2.end) break;
				insertdesk(d, pushplayer(p1));
				cout << first << " " << *(d.top - 1) << endl;
				if (p1.top == p1.end) break;
			}
			int num = d.tsize - d.esize;
			if (num % 2 == 0) //1
			{
				while (d.top != d.end)
				{
					insertp(p1, pushdesk(d));
				}
				cout << "1号收牌" << endl;
				pl2 = 0;
				pl1 = 1;
				flag = 1;
			}
			else
			{
				while (d.top != d.end)
				{
					insertp(p2, pushdesk(d));
				}
				cout << "2号收牌" << endl;
				pl2 = 1;
				pl1 = 0;
				flag = 1;
			}
		}
	}
	if (p1.top == p1.end)
	{
		return 1;
	}
	if (p2.top == p2.end)
	{
		return 2;
	}
}

void game()
{
	srand(time(0));
	int x = chupai();
	if (x == 1)
	{
		cout << "1赢" << endl;
	}
	if (x == 2)
	{
		cout << "2赢" << endl;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值