主頁 >  其他 > 【摸魚】堆疊

【摸魚】堆疊

2021-08-19 10:31:37 其他

堆疊

上一篇講的是佇列,是一種先進先出的資料結構,還有一種后進先出的資料結構,稱為堆疊,

堆疊限定為只能在一端進行插入和洗掉操作,比如往杯子里面放球,然后再往出拿,顯然,最后放入的球可以最先拿出來,

判斷回文

通過堆疊這個資料結構可以判斷一個字符是否是回文,

  • 讀取字串
char a[101];
int len;
gets(a);
len=strlen(a);
  • 如果一個字串是回文的話,那么它必須是中心對稱,求中點
mid=len/2-1;
  • 將mid之前的字符全部入堆疊,此處堆疊用來存盤字符,所以此處用來實作堆疊的陣列型別是字符陣列,char s[101];,
  • 初始化堆疊,top=0
  • 入堆疊的操作top++;s[top]=x;(假設需要入堆疊的字符暫存在字符變數x中),簡寫成s[++top]=x;
  • 代碼實作mid之前字符全部入堆疊
for(i=0;i<=mid;i++)
{
s[++top]=a[i];
}
  • 判斷回文,將當前堆疊中的字符依次出堆疊,看是否能與mid之后的字符一一匹配,如果能匹配就是回文串,否則不是,
for(i=mid+1;i<=len-1;i++)
{
if(a[i]!=s[top])
{
break;
}
top--;
}
if(top==0)
printf("YES");
else
printf("NO");

當top=0時,說明堆疊內所有的字符都被一一匹配了,那么這個字符就是回文串,

下面附判斷回文串完整代碼:

#include<stdio.h>
#include<stdlib.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;//求字串中點
	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--;	
	 }
	 //當top=0時,說明堆疊內所有的字符都被一一匹配了
	 if(top==0)
	 printf("YES\n");
	 else
	 printf("NO\n");
	 return 0; 
 } 

堆疊還可以用來進行驗證括號的匹配,

紙牌游戲——小貓釣魚

游戲規則:將一副撲克牌平均分成兩份,每人拿1份,小哼先拿出第一張撲克牌放在桌上,然后小哈也拿出手中的第一張撲克牌,并放在小哼剛打出的撲克牌上面,兩人交替出牌,出牌時,如果某人打出的牌和桌上某張牌牌面相同,即可將兩張相同的牌,及夾在其中間的牌全部拿走,并依次放在自己手中牌的末尾,當任意一個人手中的牌全部出完時,游戲結束,對手獲勝,
游戲開始時,小哼手中6張牌2,4,1,2,5,6,小哈手上也有6張牌3,1,3,5,6,4,牌面只有1~9,判斷是誰贏,

分析

對于玩家而言有2種操作:贏牌和出牌

  • 贏牌:入隊
  • 出牌:出隊

對于桌子而言有2種操作:牌被放到桌上和牌被從桌上拿走

  • 牌放到桌子上:入堆疊
  • 牌被拿走:出堆疊

兩個玩家,一張桌子,所以用兩個佇列,一個堆疊來模擬整個游戲,

完整代碼

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct queue
{
	int data[1000];
	int head;
	int tail;
 };
 struct stack
 {
 	int data[10];
 	int top;
 };
 int main()
 {
 	struct queue q1,q2;//小哼的撲克牌佇列q1,小哈的撲克牌佇列q2
	 struct stack s;//桌子上的撲克牌
	 int book[10];
	 int i,t;
	 //初始化佇列,q1,q2為空,兩人手中沒有牌 
	 q1.head=1;
	 q1.tail=1;
	 q2.head=1;
	 q2.tail=1;
	 //初始化堆疊,桌子上面沒有牌 
	 s.top=0;
	 //初始化用來標記的陣列,用來標記哪些牌已經在桌子上
	 //book[10]={0};不可取 
	 for(i=0;i<=9;i++)
	 {
	 	book[i]=0;//初始化	  
	  } 
	  //依次向佇列中插入6個數
	  //小哼手上有6張牌
	  for(i=1;i<=6;i++) 
	  {
	  	scanf("%d",&q1.data[q1.tail]);//讀入一個數到隊尾q1.data[1],q1.data[2]...
	  	q1.tail++;//隊尾往后挪一位,q1.tail=2,3... 
	  	
	   } 
	   //小哈手上有6張牌
	   for(i=1;i<=6;i++)
	   {
	   	scanf("%d",&q2.data[q2.tail]);
	   	q2.tail++;
			  }	
		//當佇列不為空時,執行回圈
		while(q1.head<q1.tail&&q2.head<q2.tail)
		{
			t=q1.data[q1.head];//小哼出一張牌,q1.data[1]
			//判斷小哼當前打出的牌是否能贏牌
			if(book[t]==0)//如果桌面上沒有為t的牌
			{
				//桌面上沒有為t的牌,說明小哼此輪沒有贏牌
				q1.head++;//小哼打出一張牌,那么這張牌就出列
				s.top++;//桌面上多出一張牌,s.top=1
				s.data[s.top]=t;//s.data[1]=t,將小哼打出的一張牌放到桌上,入堆疊
				book[t]=1;//標記桌面上此時已有牌面為t的牌 
			 } 
			 else
			 {
			 	//小哼此輪可以贏0
				 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--;//堆疊中少了一張牌,所以堆疊頂減1 
				  } 
				  //識訓桌面上牌面為t的牌
				  book[s.data[s.top]]=0;
				  q1.data[q1.tail]=s.data[s.top];
				  q1.tail++;
				  s.top--;
				  
			  } 
			  if(q1.head==q1.tail)
			  break;//如果小哼手上牌打完,那么停止游戲 
			  t=q2.data[q2.head];//小哈打出一張牌
			  if(book[t]==0)
			  {
			  	q2.head++;
			  	s.top++;
			  	s.data[s.top]=t;
			  	book[t]=1;
			  	
			   }
			   else
			   {
			   	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--;
				   }
				   book[s.data[s.top]]=0;
				   q2.data[q2.tail]=s.data[s.top];
				   q2.tail++;
				   s.top--;
				} 
		   } 
		   if(q2.head==q2.tail)
		   {
		   	printf("小哼win\n");
		   	printf("小哼當前手中的牌是");
			   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("小哈win\n");
			 	printf("小哈當前手中的牌是");
				 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;
 }
 

,,,好長的難代碼,自己一下子寫也寫不出來,這就是就是計算機模擬程序,之前涉足數模的時候,老師說要給一個模型就能用程式寫出來,我說我不能,,一個軟工的學生,多多少少得學點編程到時候還能混口飯的,,雖然數模是個水比賽,代碼大部分也是copy,,,但是我發現了計算機模擬程序是我一點都不會的,,,
在這里插入圖片描述
結束

分割線

=============================================================
判斷每個人打出一張牌之后能否贏牌,可以通過列舉桌上的每一張牌來實作,用for回圈來依次判斷桌上的每一張牌是否與打出的牌相等,
上述代碼通過用一個陣列來記錄桌上有哪些牌
因為牌面只有1~9,所以開一個大小為10的陣列來記錄當前桌上已經有哪些牌面,
book[10]
沒有贏牌時和贏牌時代碼區別:
未贏牌時:

if(book[t]==0)
	{
		q.head++;//打出一張牌,所以將打出的牌出列
		s.top++;//桌面上多出一張牌
		s.data[s.top]=t;//s.top是指向堆疊頂的變數
	}

贏牌時:

//贏牌
else//book[t]==1
	{
		q.head++;//打出一張牌,將打出的牌出列
		q.data[q.tail]=t;//已經確定能贏牌,所以就將這張牌直接放到隊尾,即放到自己手中牌的末尾
		q.tail++;
		while(s.data[s.top]!=t)//桌上和自己打的牌不一樣的牌
		{
			book[s.data[s.top]]=0;//因為牌要取走,所以就取消標記
			q.data[q.tail]=s.data[s.top];//將桌上那些牌依次放入自己手中牌之后
			q.tail++;
			s.top--;//桌面上少了1張牌
		}
		//識訓桌面上為t的牌
		book[s.data[s.top]]=0;//取消標記
		q.data[q.tail]=s.data[s.top];
		q.tail++;
		s.top--;
	}

再次回看題目,程式模擬程序對應實際游戲程序
* 出牌——>出佇列
*桌面上多一張牌——>堆疊頂+1
*桌上少一張牌——>堆疊頂-1
*贏牌時,先將打出的牌立即放到自己手中牌的最后,然后將桌面上牌和自己手中不一樣的識訓手中,依次放到自己手中末尾
*最后再將桌上的和自己手中一樣的牌收了,放入手中牌最后

=============================================================
真的結束,有補充再說吧

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294819.html

標籤:其他

上一篇:15-01、docker入門之docker網路的詳解

下一篇:Wi-Fi模組二次開發課程——0.課程介紹

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more