C/C++內存分爲五個部分:
一、棧區(stack):存放函數的參數值,局部變量的值等(編譯器自動分配釋放 )。
二、堆區(heap): 注意:與數據結構中的堆徹底不一樣,分配方式相似於鏈表(程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收 )。
三、全局區(靜態區):全局變量和靜態變量存儲在一塊,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域(程序結束後由系統釋放)。
四、文字常量區:常量字符串就是存儲在這裏(程序結束後由系統釋放)。
五、程序代碼區:存放函數體的二進制代碼。 html
在unix環境高級編程一書中,對於棧和堆是這樣定義的:ios
棧:自動變量以及每次函數調用是所需保存的信息都存放在此段中。每次調用函數時,其返回地址以及調用者的環境信息(例如某些機器寄存器的值)都存放在棧中。而後,最近被調用的函數在棧上爲其自動和臨時變量分配存儲空間。經過以這種方式使用棧,能夠遞歸調用c函數。遞歸函數每次調用自身時,就使用一個新的棧幀,所以一個函數調用實例中的變量集不會影響另外一個函數調用實例中的變量。c++
堆:一般在堆中進行動態存儲分配,因爲歷史上造成的慣例,堆位於非初始化數據段和棧之間。程序員
c++stack(堆棧)是一個容器的改編,它實現了一個先進後出的數據結構(FILO)編程
使用該容器時須要包含#include<stack>頭文件;數據結構
定義stack對象的示例代碼以下:函數
stack<int>s1;post
stack<string>s2;url
stack的基本操做有:spa
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;
}
|
二、隊列(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