栈和队列
用链表实现栈
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;
}
}