C++中堆,棧,隊列
C/C++內存分為五個部分:
1、棧區(stack):存放函數的參數值,局部變量的值等(編譯器自動分配釋放 )。
2、堆區(heap): 注意:與數據結構中的堆完全不同,分配方式類似於鏈表(程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收 )。
3、全局區(靜態區):全局變量和靜態變量存儲在一塊,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域(程序結束后由系統釋放)。
4、文字常量區:常量字符串就是存儲在這里(程序結束后由系統釋放)。
5、程序代碼區:存放函數體的二進制代碼。
在unix環境高級編程一書中,對於棧和堆是這樣定義的:
棧:自動變量以及每次函數調用是所需保存的信息都存放在此段中。每次調用函數時,其返回地址以及調用者的環境信息(例如某些機器寄存器的值)都存放在棧中。然后,最近被調用的函數在棧上為其自動和臨時變量分配存儲空間。通過以這種方式使用棧,可以遞歸調用c函數。遞歸函數每次調用自身時,就使用一個新的棧幀,因此一個函數調用實例中的變量集不會影響另一個函數調用實例中的變量。
堆:通常在堆中進行動態存儲分配,由於歷史上形成的慣例,堆位於非初始化數據段和棧之間。
c++stack容器介紹,引自https://www.cnblogs.com/hdk1993/p/5809161.html
c++stack(堆棧)是一個容器的改編,它實現了一個先進后出的數據結構(FILO)
使用該容器時需要包含#include<stack>頭文件;
定義stack對象的示例代碼如下:
stack<int>s1;
stack<string>s2;
stack的基本操作有:
1.入棧:如s.push(x);
2.出棧:如 s.pop().注意:出棧操作只是刪除棧頂的元素,並不返回該元素。
3.訪問棧頂:如s.top();
4.判斷棧空:如s.empty().當棧空時返回true。
5.訪問棧中的元素個數,如s.size();
下面舉一個簡單的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include<iostream>
#include<stack>
using
namespace
std;
int
main(
void
)
{
stack<
double
>s;
//定義一個棧
for
(
int
i=0;i<10;i++)
s.push(i);
while
(!s.empty())
{
printf
(
"%lf\n"
,s.top());
s.pop();
}
cout<<
"棧內的元素的個數為:"
<<s.size()<<endl;
return
0;
}
|
2、隊列(queue)說明及舉例:
使用隊列,要先包含頭文件 : #include<queue>
定義隊列,以如下形式實現: queue<Type> q; 其中Type為數據類型(如 int,float,char等)。
隊列的主要操作:
q.push(item) //將item壓入隊列尾部
q.pop() //刪除隊首元素,但不返回
q.front() //返回隊首元素,但不刪除
q.back() //返回隊尾元素,但不刪除
q.size() //返回隊列中元素的個數
q.empty() //檢查隊列是否為空,如果為空返回true,否則返回false
隊列操作舉例
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
void main()
{
queue<int> q;
int num;
cout<<"------Test for Queue-------"<<endl;
cout<<"Input number:"<<endl;
while(cin>>num)
{
q.push(num);
}
cout<<"Now the Queue has "<<q.size()<<" numbers."<<endl;
cout<<"The first is "<<q.front()<<endl;
cout<<"The last is "<<q.back()<<endl;
cout<<"All numbers:"<<endl;
while(!q.empty())
{
cout<<q.front()<<" ";
q.pop();
}
cout<<"Now the Queue has "<<q.size()<<" numbers."<<endl;
system("Pause");
}
參考: https://blog.csdn.net/dai_wen/article/details/81712239
STL:https://blog.csdn.net/qq_37360631/article/details/81299507