真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++通用棧代碼怎么編寫(xiě)-創(chuàng)新互聯(lián)

C++通用棧代碼怎么編寫(xiě),相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶(hù)真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。成都創(chuàng)新互聯(lián)推出烏海免費(fèi)做網(wǎng)站回饋大家。

先貼出代碼:

#include"stdafx.h"

template 
class STACK
{
public:
	void operator--(int)
	{
		index--;
	}
	void operator-(long count)
	{
		index-=count;
	}
	void operator+(T value)
	{
		Push(value);
	}
	long operator+=(T value)
	{
		return PushDifferent(value);
	}
	T&operator[](long addr)
	{
		if(addr<0)return data[index+1+addr];
		return data[addr];
	}
public:
	STACK()
	{
		basicLen=BASICLEN;
		len=0;
		data=NULL;
		index=-1;
	}
	STACK(long basiclen)
	{
		basicLen=basiclen;
		len=0;
		data=NULL;
		index=-1;
	}
	STACK(T initValue,long count)
	{
		this->basicLen=BASICLEN;
		this->len=0;
		index=-1;
		data=NULL;
		for(long i=0;ii;j--)if(set[j]val){set[j]=set[i];break;}
		}
		set[i]=val;
		SortLong(set,i);
		SortLong(set+i+1,count-i-1);
	}
	void Extern()
	{
		if(index

這是我最近做編譯器時(shí)自己創(chuàng)建的一個(gè)功能比較多的C++棧代碼,使用了模板類(lèi)來(lái)作為棧的數(shù)據(jù)類(lèi)型,所以理論上支持很多的數(shù)據(jù)類(lèi)型,比如long,int,bool,char,char*.也支持用戶(hù)自定義的類(lèi)(但請(qǐng)不要使用結(jié)構(gòu)類(lèi)型,否則可能會(huì)出錯(cuò))類(lèi)型。
同時(shí),為了便于棧的操作,在里面重載了一些運(yùn)算符。我把這個(gè)棧的功能寫(xiě)在下面便于大家參考:
0.初始化:(1)STACK():正常的初始化;默認(rèn)的基本塊長(zhǎng)度為5.
         (2)STACK(long b):初始化時(shí)把棧的基本塊長(zhǎng)度設(shè)為b.b應(yīng)為正整數(shù)。這個(gè)初始化函數(shù)與第一個(gè)作用一樣,提供這個(gè)函數(shù)是為了讓用戶(hù)在程序執(zhí)行速度與內(nèi)存開(kāi)銷(xiāo)間作一個(gè)合理的選擇。
         (3)STACK(T iv,long c):初始化后在棧中寫(xiě)入c個(gè)值為iv的數(shù)據(jù)。
1.入棧:(1)Push(T v)或+v:把數(shù)據(jù)v寫(xiě)入棧頂。無(wú)返回值;
       (2)PushDifferent(T v)或+=v:如果在棧里面沒(méi)有v這個(gè)數(shù)據(jù),則把v寫(xiě)入棧頂,返回值為-1;否則返回v在棧中的索引。(如果數(shù)據(jù)類(lèi)型不是可比較大小的,則需要在那個(gè)數(shù)據(jù)類(lèi)中重載==運(yùn)算符(返回類(lèi)型應(yīng)為bool型),否則會(huì)出錯(cuò))
2.出棧:(1)Pop()或--:去掉處于棧頂?shù)臄?shù)據(jù);
       (2)Pop(long c)或-c:去掉自棧頂向下的c個(gè)數(shù)據(jù);
3.讀棧:(1)Peek():讀出棧頂數(shù)據(jù);
       (2)Peek(long i):讀出棧中索引為i的數(shù)據(jù);
       (3)[i]:若i為非負(fù)數(shù),返回棧中data[i]的引用,若i為負(fù)數(shù),返回data[index+i+1]的引用。
4.置棧:(1)Set(T v)更改棧頂?shù)臄?shù)據(jù)為v;
       (2)Set(long i,T v)更改棧中索引為i處的數(shù)據(jù)為v;
5.讀當(dāng)前索引:Index():返回當(dāng)前的索引值.棧底的索引為0,以此往上推。
6.重置棧:Reset():重置棧索引為-1,也就是清空棧(實(shí)際數(shù)據(jù)還在,只是棧索引沒(méi)有指向其中的數(shù)據(jù)了)。
7.讀取數(shù)據(jù)索引:Id(T v):如果棧中有數(shù)據(jù)v,返回v的索引;否則返回-1(表示沒(méi)有v)。
8.從小到大排序:SortMinToMax():把棧中的數(shù)據(jù)按從小到大的順序排列,這會(huì)改變棧中的數(shù)據(jù)。如果數(shù)據(jù)類(lèi)型不是可比較大小的,則需要在那個(gè)數(shù)據(jù)類(lèi)中重載<,>(返回類(lèi)型應(yīng)為bool型)這兩個(gè)運(yùn)算符,否則會(huì)出錯(cuò)。
9.私有函數(shù)說(shuō)明:Extern():這個(gè)函數(shù)是當(dāng)索引指針超過(guò)data的數(shù)據(jù)個(gè)數(shù)len時(shí)增大data的數(shù)據(jù)個(gè)數(shù)。在Push(T v)、PushDifferent(T v)和STACK(T iv,long c)中都會(huì)調(diào)用該函數(shù)以自動(dòng)增大data的大小。

應(yīng)用例子:
0.初始化:(1)STACK stack;//聲明了一個(gè)棧,名字為stack。
         (2)STACK stack=STACK(2);//聲明了一個(gè)棧stack,這個(gè)棧的基本數(shù)據(jù)個(gè)數(shù)為2。
         (3)STACK stack=STACK("fvck",8);//聲明了一個(gè)棧stack,并入其中寫(xiě)入了8個(gè)"fvck"。

1.入棧:
STACK st;
(1)st.Push('a');//把a(bǔ)置入棧中
(2)st+'a';//同上
(3)st.PushDifferent('a');//若棧中沒(méi)有'a',把'a'置入棧中
(4)st+='a';//同上

2.出棧:假設(shè)棧st中有數(shù)據(jù)2,3,1,4,7
(1)st.Pop();//數(shù)據(jù)變?yōu)?,3,1,4
(2)st--;//同上
(3)st.Pop(2);//數(shù)據(jù)變?yōu)?,3,1
(4)st-2;//同上

3.讀棧:假設(shè)棧st中有數(shù)據(jù)2,5,3,4
(1)a=st.Peek();//a的值為4
(2)a=st.Peek(1);//a的值為5
(3)a.st.Peek(0);//工的值為2

(3)a=st[1];//a的值為5
(4)a=st[-1];//a的值為4
(5)a=st[-3];//工的值為5
置棧:
(6)st[0]=8;//棧中數(shù)據(jù)變?yōu)?,5,3,4
(7)st[-2]=9;//棧中數(shù)據(jù)變?yōu)?,5,9,4
從(3)~(7)我們看出可以把棧當(dāng)成數(shù)組來(lái)使用,而且這個(gè)數(shù)組不需要聲明大小,但需要使用Push等函數(shù)來(lái)擴(kuò)展長(zhǎng)度。數(shù)組的索引可以為負(fù),當(dāng)為負(fù)時(shí),-1表示棧頂,依次往下數(shù)。

4.置棧:假設(shè)棧st中有數(shù)據(jù)4,2,34,5,99
(1)st.Set(8);//棧中數(shù)據(jù)變?yōu)?,2,34,5,8
(2)st.Set(2,8);//棧中數(shù)據(jù)變?yōu)?,2,8,5,99

5.讀當(dāng)前索引:假設(shè)棧st中有數(shù)據(jù)3,4,24,5,9,9,8
long i=st.Index();//i的值為6

6.重置棧:假設(shè)棧st中有數(shù)據(jù)23,4,2
st.Reset();//棧中沒(méi)有數(shù)據(jù)了

7.讀取數(shù)據(jù)索引:假設(shè)棧st中有數(shù)據(jù)2,33,4,22,5
(1)long i=st.Id(22);//i的值為3
(2)long i=st.Id(8);//i的值為-1

8.從小到大排序:假設(shè)棧st中有數(shù)據(jù)2,3,44,9,7
st.SortMinToMax();//棧中數(shù)據(jù)變?yōu)?,3,7,9,44
從2~8,為了方便,我們棧中的數(shù)據(jù)都是整數(shù)值,這是明顯可以比較大小的數(shù)據(jù),那么對(duì)于用戶(hù)自定義的數(shù)據(jù),怎么樣才能使用PushDifferent與+=呢?例子如下(這是我編譯器中的一個(gè)類(lèi)聲明代碼):

class RANGE
{
public:
	static const unsigned long R_MIN=0,R_MAX=0xffff;
	//全部相等
	bool operator==(RANGE v)
	{
		if(this->left==v.left&&this->right==v.right&&this->flag==v.flag)return true;
		return false;
	}
	bool operator<=(RANGE v)
	{
		if(v.flag==RANGE::WITHIN)
		{
			if(this->left>=v.left&&this->right<=v.right)return true;
		}
		else if(v.flag==RANGE::WITHOUT)
		{
			if(this->left>=R_MIN&&this->right<=v.left)return true;
			if(this->left>=v.right&&this->right<=R_MAX)return true;
		}
		return false;
	}
public:
	RANGE()
	{

	}
	RANGE(long left,long right,int flag)
	{
		this->left=left;
		this->right=right;
		this->flag=flag;
	}
public:
	enum{WITHIN,WITHOUT};
	long left,right;
	int flag;
};

在這個(gè)類(lèi)中,重載了==運(yùn)算符,而且返回值為bool型,所以RANGE類(lèi)型的數(shù)據(jù)可以在PushDifferent與+=中使用。

看完上述內(nèi)容,你們掌握C++通用棧代碼怎么編寫(xiě)的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!


本文名稱(chēng):C++通用棧代碼怎么編寫(xiě)-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://weahome.cn/article/dijees.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部