本系列为C++数据结构系列,会介绍 线性结构,简单树,特殊树,简单图等。本文为线性结构部分。
栈是Stack一个后进先出Last In First Out,LIFO的线性表,他要求只在表尾对数据执行删除和插入等操作。 栈就是一个线性表,可以是数组、也可以是链表。但它的操作有别于一般的线性表。栈的元素必须先进后出,也就是先进入栈的元素必须后出栈。而不能像一般的链表或数组那样从任意位置读取元素。 栈的操作只能在线性表的表尾进行,这个标为被称为栈的栈顶top,相应的表头被称为栈的栈底bottom
栈的数据必须从栈顶进入,也必须从栈顶取出,先入栈的数据在后入栈的数据下面。 栈中不含有任何数据时的状态叫作空栈,此时栈顶top等于栈底bottom。
#include <stdio.h>
#include <string.h>
int main ( )
{
char a[ 101],s[101] ;
int i, len, mid,next, top;
gets(a) ; //读入一行字符串
len=strlen(a) ; //求字符串的长度
mid=len / 2-1; //l求字符串的中点
top=0 ; //栈的初始化
//将mid前的字符依次入栈
for(i=0 ; i<=mid; i++)
s [++top]=a[ i] ;
//判断字符串的长度是奇数还是偶数,并找出需要进行字符匹配的起始下标
if ( len%2==0 )
next=mid+1;
else
next=mid+2;
//开始匹配
for(i=next; i<=len-1; i++)
{
if(a[i]!=s[top])
break;
top--;
}
if(top==0)
printf("yes");
else
printf("no");
getchar();
getchar();
return 0;
}
#include <stdio.h>
struct queue
{
int data[100];//100
int head;
int tail;
};
struct stack
{
int data[10];
int top;
};
int main ( )
{
struct queue q1,q2;
struct stack s;
int book[10]= {0};
int i,t;
//初始化队列
q1.head=1;
q1.tail=1;
q2.head=1;
q2.tail=1;
// 初始化栈
s.top=0;
//int q1_data[7]= {0,2,4,1,2,5,6};
//初始化标记数组,标记哪些牌在桌上
for(i=1; i<=6; i++)
{
scanf("%d",&q1.data[q1.tail]);
//q1.data[q1.tail]=q1_data[i];
q1.tail++;
}
//int q2_data[7]= {0,3,1,3,5,6,4};
//初始化标记数组,标记哪些牌在桌上
for(i=1; i<=6; i++)
{
scanf("%d",&q2.data[q2.tail]);
//q2.data[q1.tail]=q2_data[i];
q2.tail++;
}
//当队列不为空时执行循环
while(q1.head<q1.tail &&
q2.head<q2.tail)
{
t=q1.data[q1.head];//q1取出一张牌
printf("q1---> t %d , book[t] %d \n",&t,&book[t]);
// 判断q1当前打出的牌能否赢牌
if(book[t]==0)//表明桌面上没有牌面为t的牌
{
// q1次轮没有赢牌
q1.head++;//把q1打出的牌出列
s.top++;
s.data[s.top]=t;//把打出的牌t放在桌上,入栈
book[t]=1;//标记桌上有牌面为t的牌
}
else
{
//q1可以赢牌
q1.head++;
q1.data[q1.tail]=t;//把刚打的牌放在手牌中的末尾 入队
q1.tail++;
//把桌上可以赢得的牌依次放入手中
while(s.data[s.top]!=t)
{
book[s.data[s.top]]=0;//取消标记
q1.data[q1.tail]=s.data[s.top];//依次放入队尾
q1.tail++;
s.top--; //栈中少了一张牌,栈顶减一
}
}
//q2出一张牌
t=q2.data[q2.head];
printf("q2---> t %d , book[t] %d \n",&t,&book[t]);
// 判断q2当前打出的牌能否赢牌
if(book[t]==0)//表明桌面上没有牌面为t的牌
{
// q2次轮没有赢牌
q2.head++;//把q1打出的牌出列
s.top++;
s.data[s.top]=t;//把打出的牌t放在桌上,入栈
book[t]=1;//标记桌上有牌面为t的牌
}
else
{
//q2可以赢牌
q2.head++;
q2.data[q2.tail]=t;//把刚打的牌放在手牌中的末尾 入队
q2.tail++;
//把桌上可以赢得的牌依次放入手中
while(s.data[s.top]!=t)
{
book[s.data[s.top]]=0;//取消标记
q2.data[q2.tail]=s.data[s.top];//依次放入队尾
q2.tail++;
s.top--; //栈中少了一张牌,栈顶减一
}
}
}
if(q2.head ==q2.tail)
{
printf("q1赢win\n");
printf("q1当前手中的牌是:");
for(i=q1.head; i<=q1.tail-1; i++)
{
printf(" %d",q1.data[i]);
}
//如果桌面有牌,输出桌面的牌
if(s.top>0)
{
printf("\n桌上的牌是");
for(i=1; i<=s.top; i++)
{
printf(" %d",s.data[i]);
}
}
else
{
printf("\n桌上没牌了");
}
}
else
{
printf("q2赢win\n");
printf("q2当前手中的牌是:");
for(i=q2.head; i<=q2.tail-1; i++)
{
printf(" %d",q2.data[i]);
}
//如果桌面有牌,输出桌面的牌
if(s.top>0)
{
printf("\n桌上的牌是");
for(i=1; i<=s.top; i++)
{
printf(" %d",s.data[i]);
}
}
else
{
printf("\n桌上没牌了");
}
}
getchar();
getchar();
return 0;
}