參考:
線性結(jié)構(gòu)-棧
總結(jié)
本系列為C++數(shù)據(jù)結(jié)構(gòu)系列,會(huì)介紹 線性結(jié)構(gòu),簡(jiǎn)單樹,特殊樹,簡(jiǎn)單圖等。本文為線性結(jié)構(gòu)部分。
大綱要求
- 線性結(jié)構(gòu)
【 3 】鏈表:?jiǎn)捂湵怼㈦p向鏈表、循環(huán)鏈表
【 3 】棧
【 3 】隊(duì)列
線性結(jié)構(gòu)-棧
棧是Stack一個(gè)后進(jìn)先出Last In First Out,LIFO的線性表,他要求只在表尾對(duì)數(shù)據(jù)執(zhí)行刪除和插入等操作。
棧就是一個(gè)線性表,可以是數(shù)組、也可以是鏈表。但它的操作有別于一般的線性表。棧的元素必須先進(jìn)后出,也就是先進(jìn)入棧的元素必須后出棧。而不能像一般的鏈表或數(shù)組那樣從任意位置讀取元素。
棧的操作只能在線性表的表尾進(jìn)行,這個(gè)標(biāo)為被稱為棧的棧頂top,相應(yīng)的表頭被稱為棧的棧底bottom
棧的數(shù)據(jù)必須從棧頂進(jìn)入,也必須從棧頂取出,先入棧的數(shù)據(jù)在后入棧的數(shù)據(jù)下面。
棧中不含有任何數(shù)據(jù)時(shí)的狀態(tài)叫作空棧,此時(shí)棧頂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) ; //求字符串的長(zhǎng)度
mid=len / 2-1; //l求字符串的中點(diǎn)
top=0 ; //棧的初始化
//將mid前的字符依次入棧
for(i=0 ; i<=mid; i++)
s [++top]=a[ i] ;
//判斷字符串的長(zhǎng)度是奇數(shù)還是偶數(shù),并找出需要進(jìn)行字符匹配的起始下標(biāo)
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;
}
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-579406.html
小貓釣魚的故事
#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;
//初始化隊(duì)列
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};
//初始化標(biāo)記數(shù)組,標(biāo)記哪些牌在桌上
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};
//初始化標(biāo)記數(shù)組,標(biāo)記哪些牌在桌上
for(i=1; i<=6; i++)
{
scanf("%d",&q2.data[q2.tail]);
//q2.data[q1.tail]=q2_data[i];
q2.tail++;
}
//當(dāng)隊(duì)列不為空時(shí)執(zhí)行循環(huán)
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當(dāng)前打出的牌能否贏牌
if(book[t]==0)//表明桌面上沒(méi)有牌面為t的牌
{
// q1次輪沒(méi)有贏牌
q1.head++;//把q1打出的牌出列
s.top++;
s.data[s.top]=t;//把打出的牌t放在桌上,入棧
book[t]=1;//標(biāo)記桌上有牌面為t的牌
}
else
{
//q1可以贏牌
q1.head++;
q1.data[q1.tail]=t;//把剛打的牌放在手牌中的末尾 入隊(duì)
q1.tail++;
//把桌上可以贏得的牌依次放入手中
while(s.data[s.top]!=t)
{
book[s.data[s.top]]=0;//取消標(biāo)記
q1.data[q1.tail]=s.data[s.top];//依次放入隊(duì)尾
q1.tail++;
s.top--; //棧中少了一張牌,棧頂減一
}
}
//q2出一張牌
t=q2.data[q2.head];
printf("q2---> t %d , book[t] %d \n",&t,&book[t]);
// 判斷q2當(dāng)前打出的牌能否贏牌
if(book[t]==0)//表明桌面上沒(méi)有牌面為t的牌
{
// q2次輪沒(méi)有贏牌
q2.head++;//把q1打出的牌出列
s.top++;
s.data[s.top]=t;//把打出的牌t放在桌上,入棧
book[t]=1;//標(biāo)記桌上有牌面為t的牌
}
else
{
//q2可以贏牌
q2.head++;
q2.data[q2.tail]=t;//把剛打的牌放在手牌中的末尾 入隊(duì)
q2.tail++;
//把桌上可以贏得的牌依次放入手中
while(s.data[s.top]!=t)
{
book[s.data[s.top]]=0;//取消標(biāo)記
q2.data[q2.tail]=s.data[s.top];//依次放入隊(duì)尾
q2.tail++;
s.top--; //棧中少了一張牌,棧頂減一
}
}
}
if(q2.head ==q2.tail)
{
printf("q1贏win\n");
printf("q1當(dāng)前手中的牌是:");
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桌上沒(méi)牌了");
}
}
else
{
printf("q2贏win\n");
printf("q2當(dāng)前手中的牌是:");
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桌上沒(méi)牌了");
}
}
getchar();
getchar();
return 0;
}
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-579406.html
到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)01-線性結(jié)構(gòu)-鏈表?xiàng)j?duì)列-棧篇的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!