亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++中棧結構建立與操作詳細解析

2020-01-26 15:44:56
字體:
來源:轉載
供稿:網友

什么是棧結構

棧結構是從數據的運算來分類的,也就是說棧結構具有特殊的運算規則,即:后進先出。

我們可以把棧理解成一個大倉庫,放在倉庫門口(棧頂)的貨物會優先被取出,然后再取出里面的貨物。

而從數據的邏輯結構來看,棧結構起始就是一種線性結構。

如果從數據的存儲結構來進一步劃分,棧結構包括兩類:
順序棧結構:

即使用一組地址連續的內存單元依次保存棧中的數據。在程序中,可以定義一個指定大小的結構數組來作為棧,序號為0的元素就是棧低,再定義一個變量top保存棧頂的序號即可。
鏈式棧結構:

即使用鏈表的的形式保存棧中各元素的值。鏈表首部(head指針所指向元素)為棧頂,鏈表尾部(指向地址為NULL)為棧底。

在棧結構中只能在一端進行操作,該操作端稱為棧頂,另一端稱為棧底。也就是說,保存和取出的數據都只能從棧結構的一端進行。從數據的運算角度來分析,棧結構是按照“后進先出”的原則處理結點數據的。

在棧結構中,只有棧頂元素是可以訪問的,棧結構的數據運算也是非常簡單。一般棧結構的基本操作只有兩個:

入棧(Push):將數據保存到棧頂的操作。進行入棧操作前,先修改棧頂指針,使其向上移一個元素位置,然后將數據保存到棧頂指針所指的位置。

出棧(Pop):將棧頂數據彈出的操作。通過修改棧頂指針,使其指向棧中的下一個元素。

接下來,我們使用C++語言建立順序棧,并完成順序棧結構的基本運算
準備數據

準備在棧操作中需要用到的變量及數據結構等。

復制代碼 代碼如下:

#define MAXLEN 50
struct DATA
{
 string name;
 int age;
};
struct StackType
{
 DATA data[MAXLEN+1];
 int top;
};


定義棧結構的長度MAXLEN,棧結構的數據元素類型DATA,以及棧結構的數據結構StackType。在數據結構StackType中,data為數據元素,top為棧頂的序號。當top=0時,表示棧為空,當top=MAXLEN時表示棧滿。

數組元素都是充下標0開始的,這里為了講述和理解方便,我們從下標1開始記錄數據結點,下標0的位置不用。
初始化棧結構

在使用棧結構之前,首先需要創建一個空的順序棧,也就是初始化順序棧。順序棧的初始化操作如下:

(1)按照符號常量MAXLEN指定大小申請一片內存空間,用來保存棧中的數據

(2)設置棧頂指針的值為0,表示一個空棧。

示例代碼如下:

復制代碼 代碼如下:

StackType *STInit()
{
 StackType *p;
 if(p=new StackType)   //申請??臻g
 {
  p->top=0;     //設置棧頂為0
  return p;     //返回棧頂指針
 } 
 return NULL; 
}

首先用new申請內存,然后設置棧頂為0,然后返回申請內存的首地址,申請失敗返回NULL;

判斷空棧

判斷棧結構是否為空,如果是空棧,則表示該棧結構中沒有數據,此時可以進行入棧操作,但是不可以進行出棧操作。

示例代碼如下:

復制代碼 代碼如下:

int STIsEmpty(StackType *s)
{
 int t;
 t=(s->top==0);     //通過棧頂的值進行判斷
 return t;
}

輸入參數s為一個指向操作的棧的指針。根據棧頂指針top判斷是否為0,判斷棧是否為空。

判斷滿棧

判斷棧結構是否為滿。如果是滿棧,則表示該棧結構中沒有多余的空間來保存額外數據。此時不可以進行入棧操作,但是可以進行進棧操作。

示例代碼如下:

復制代碼 代碼如下:

int STIsFull(StackType *s)
{
 int t;
 t=(s->top==MAXLEN);
 return t;
}

輸入參數s為一個指向操作的棧的指針。根據棧頂指針top判斷是否和MAXLEN相等,判斷棧是否已滿。

清空棧

清空棧就是棧中所有的數據被清除。 示例代碼如下:

復制代碼 代碼如下:

void STClear(StackType *s)
{
 s->top=0;
}

將棧頂指針top設置為0,表示執行清空棧操作。(這里只是邏輯上將棧中數據清空,實際上只是將top設置為0,以后再添加數據會覆蓋原來的數據)

釋放空間

釋放空間是釋放棧結構所占用的內存單元,使用delete釋放用new運算符申請的內存空間。

示例代碼如下:

復制代碼 代碼如下:

void STFree(StackType *s)
{
 delete s;
}

在程序中直接調用delete運算符釋放已分配的內存空間。一般在不需要使用棧結構時調用該函數,特別是在程序結束的時候。

入棧

入棧(Push)是棧結構的基本操作,主要操作是將數據元素保存到棧結構。入棧操作的具體步驟如下:

(1)首先判斷棧頂top,如果top大于等于MAXLEN,則表示溢出,進行出錯處理。否則執行以下操作。

(2)設置top=top+1(棧頂指針加1,指向入棧地址)

(3)將入棧呀U尿素保存到top指向的位置。

示例代碼如下:

復制代碼 代碼如下:

int PushST(StackType *s,DATA data)
{
 if((s->top+1)>MAXLEN)
 {
  cout<<"棧溢出"<<endl;
  return 0;
 }
 s->data[++s->top]=data;     //將元素壓入棧
 return 1;
}

輸入參數s為一個指向操作的棧的指針,輸入參數data是需要入棧的數據元素。程序首先判斷棧是否溢出,如果溢出就給出警告,不進行入棧操作,否則修改棧頂指針,即top先加1,然后將data放到top現在指向的數據單元。

出棧

出棧(Pop)是占據誒狗的基本操作,主要操作與入棧相反,它是從棧頂彈出一個數據元素,出棧操作的具體步驟如下:

(1)首先判斷棧頂top,如果top等于0,則表示為恐慌在哪,進行出錯處理。否則執行下面的操作。

(2)將棧頂指針top所指向的位置的元素返回(實際是返回的指針)

(3)將top的減1,指向棧的下一個元素,原來棧頂的元素被彈出。

復制代碼 代碼如下:

DATA * PopST(StackType *s)
{
 if(s->top==0)
 {
  cout<<"棧為空,不能再輸出!"<<endl;
  exit(0);
 }
 return &(s->data[s->top--]);
}

當棧中有數據時,該函數返回值是一個指向DATA類型數據的指針。

讀取點結構

讀取點結構也就是讀取棧結構中結點的數據。由于棧結構只能在一端進行操作,因此這里的讀操作其實就是讀站點的數據。

需要注意的是,讀節點數據的操作和出棧操作不同。讀結點操作僅僅是顯示棧頂結點數據的內容,而出棧操作則將棧頂數據彈出。

示例代碼如下:

復制代碼 代碼如下:

DATA *PeekST(StackType *s)
{
 if(s->top==0)
 {
  cout<<"棧已空"<<endl;
  exit(0);
 }
 return &(s->data[s->top]);
}

對比出棧的示例代碼,不難發現讀取點結構同樣返回了棧頂結點的地址,但是卻沒有使top減1.

完整示例

下面是棧的基本操作的完整示例:

程序代碼:

復制代碼 代碼如下:

#include<iostream>
#include<string>
using namespace std;
#define MAXLEN 50
struct DATA
{
 string name;
 int age;
};
struct StackType
{
 DATA data[MAXLEN+1];
 int top;
};
/******************初始化棧結構****************/
StackType *STInit()
{
 StackType *p;
 if(p=new StackType)   //申請棧空間
 {
  p->top=0;     //設置棧頂為0
  return p;     //返回棧頂指針
 } 
 return NULL; 
}
/****************判斷空棧**********************/
int STIsEmpty(StackType *s)
{
 int t;
 t=(s->top==0);     //通過棧頂的值進行判斷
 return t;
}
/**********************判斷滿棧****************/
int STIsFull(StackType *s)
{
 int t;
 t=(s->top==MAXLEN);
 return t;
}
/**********************清空棧**********************/
void STClear(StackType *s)
{
 s->top=0;
}
/********************釋放空間********************/
void STFree(StackType *s)
{
 delete s;
}
/**********************入棧***********************/
int PushST(StackType *s,DATA data)
{
 if((s->top+1)>MAXLEN)
 {
  cout<<"棧溢出"<<endl;
  return 0;
 }
 s->data[++s->top]=data;     //將元素壓入棧
 return 1;
}
/************************出棧***********************/
DATA * PopST(StackType *s)
{
 if(s->top==0)
 {
  cout<<"棧為空,不能再輸出!"<<endl;
  exit(0);
 }
 return &(s->data[s->top--]);
}
/**********************讀取點結構*******************/
DATA *PeekST(StackType *s)
{
 if(s->top==0)
 {
  cout<<"棧已空"<<endl;
  exit(0);
 }
 return &(s->data[s->top]);
}
/*****************進入主函數**********************/
int main()
{
 StackType *stack;
 DATA data,*p_data;
 stack=STInit();
 cout<<"===============入棧操作:============="<<endl;
 cout<<"輸入姓名 ,年齡進行入棧操作:"<<endl;
 //執行入棧操作
 while(1)
 {
  cin>>data.name>>data.age;
  if(data.name=="0")
  {
   break;      //當姓名和年齡都是0的時候退出輸入
  }else
  {
   PushST(stack,data);
  }

 }
 p_data=PopST(stack);
 cout<<"彈出棧頂元素"<<endl;
 cout<<"name:"<<p_data->name<<",age:"<<p_data->age<<endl;
 p_data=PeekST(stack);
 cout<<"輸出棧頂元素"<<endl; 
 cout<<"name:"<<p_data->name<<",age:"<<p_data->age<<endl;
 cout<<"================將所有的的數據出棧:============="<<endl;
 while(1)
 {
  p_data=PopST(stack);
  cout<<"name:"<<p_data->name<<",age:"<<p_data->age<<endl;
 }
 STFree(stack);
 return 0;
}


程序運行界面:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
福利视频一区二区| 国产精品入口福利| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲国产日韩欧美在线图片| 亚洲色图激情小说| 中文字幕视频在线免费欧美日韩综合在线看| 欧美在线视频免费播放| 欧美在线视频一区| 中文字幕在线成人| 亚洲国产精品专区久久| 亚洲老板91色精品久久| 国产精品久久婷婷六月丁香| 91免费精品国偷自产在线| 国产日韩在线亚洲字幕中文| 亚洲最新视频在线| 精品国产视频在线| 欧美电影免费观看大全| 日韩中文字幕免费视频| 91免费人成网站在线观看18| 国产精品美女网站| 国产亚洲精品久久| 精品国产自在精品国产浪潮| 国产精品观看在线亚洲人成网| 国产精品视频地址| 久久91精品国产91久久久| 国产一区二区日韩精品欧美精品| 97视频在线观看成人| 亚洲区免费影片| 伊人久久久久久久久久久久久| 日韩精品亚洲视频| 亚洲成人黄色在线观看| 欧美激情视频网站| 91精品一区二区| 人妖精品videosex性欧美| 96精品久久久久中文字幕| 亚洲男人天堂古典| 欧美性极品少妇精品网站| 国产亚洲欧洲黄色| 国产精品视频网址| 日韩在线观看免费| 欧美中文字幕视频在线观看| 久久人人爽人人爽人人片av高请| 国产精品视频地址| 中文字幕成人精品久久不卡| 日韩专区中文字幕| 亚洲成人激情图| 一本色道久久综合亚洲精品小说| 91久久久国产精品| 国产精品无码专区在线观看| 国产精品电影久久久久电影网| 在线播放日韩专区| 欧美成人免费全部观看天天性色| 日韩欧美在线免费观看| 亚洲最大的网站| 久久久久久91香蕉国产| 国产精品专区第二| 国产精品男人的天堂| 538国产精品一区二区免费视频| 一本色道久久综合狠狠躁篇的优点| 亚洲全黄一级网站| 国产成人精品视| 色狠狠av一区二区三区香蕉蜜桃| 97人人模人人爽人人喊中文字| 精品香蕉在线观看视频一| 狠狠综合久久av一区二区小说| 国产午夜精品视频免费不卡69堂| 国产精品成人品| 中文字幕综合一区| 欧美老女人在线视频| 久久精品91久久久久久再现| 亚洲精选在线观看| 日韩美女免费线视频| 在线日韩日本国产亚洲| 2019中文字幕在线免费观看| 成人在线免费观看视视频| 91精品视频在线免费观看| 国产一区二区三区免费视频| 色老头一区二区三区| 日本午夜人人精品| 日韩**中文字幕毛片| 国产一区二区三区三区在线观看| 精品久久久久久| 午夜精品一区二区三区在线播放| 欧美日韩国产丝袜另类| 色婷婷综合久久久久中文字幕1| 欧美日韩国产一区二区三区| 在线播放国产精品| 国产xxx69麻豆国语对白| 九九九久久国产免费| 午夜精品久久久99热福利| 日韩精品视频在线免费观看| 国产91精品久| 久久精品美女视频网站| 性欧美xxxx交| 精品久久久久久久久久久| 日韩精品中文在线观看| 久久全国免费视频| 国产精品电影久久久久电影网| 黄色成人av在线| 一区二区欧美日韩视频| 欧美性猛交xxxx黑人猛交| 91亚洲国产精品| 欧美成人黑人xx视频免费观看| 中文字幕日韩高清| 久久国产精品首页| 久久久免费高清电视剧观看| 国产男人精品视频| 在线播放亚洲激情| 欧美高跟鞋交xxxxhd| 国产成人福利夜色影视| 91在线直播亚洲| 日韩少妇与小伙激情| 亚洲人成毛片在线播放| 操91在线视频| 国产在线视频2019最新视频| 国产专区精品视频| 国产精品美女在线| 色诱女教师一区二区三区| 在线视频欧美日韩| 一区三区二区视频| 亚洲国产精彩中文乱码av在线播放| 国内外成人免费激情在线视频| 日本精品视频网站| 国产一区二区免费| 91在线精品播放| 日韩精品极品毛片系列视频| 欧美国产日本高清在线| 欧美电影在线免费观看网站| 欧美日韩黄色大片| 97久久久免费福利网址| 国产日韩在线精品av| 亚洲欧美日韩精品久久亚洲区| 欧美激情第99页| 91日本视频在线| 欧美激情视频一区二区三区不卡| 成人黄色影片在线| 亚洲精品成a人在线观看| 亚洲精品午夜精品| 国产丝袜一区视频在线观看| 欧美成人精品一区| 这里精品视频免费| 国产精品久久久久久久久男| 日韩精品欧美激情| 国产精品视频网址| 欧美日韩中文字幕在线| 色先锋久久影院av| 国产精品久久久久久久久久久新郎| 久久夜色精品国产欧美乱| 美女精品久久久| 国产精品老女人视频| 欧美精品xxx| 一本色道久久综合狠狠躁篇怎么玩| 国产精品久久久久久一区二区| 国产欧美日韩免费看aⅴ视频| 国产精品亚发布| 国产精品一区二区三| 国内精品视频在线| 亚洲成人久久电影| 成人国产精品一区| 国产伊人精品在线| 一区二区三区黄色| 一区二区欧美亚洲| 日韩欧美国产一区二区| 国产69精品久久久久9999|