堆栈 在C语言中看到的,是什么东西啊.有什么作用啊,怎么用?

作者&投稿:端木显 (若有异议请与网页底部的电邮联系)
c++堆栈中 top() pop()的具体作用是什么~

top()是取栈顶元素
pop()是弹出栈顶元素

stack a;
a.push(1); // 1
a.push(2); // 1 2
a.push(3); // 1 2 3
int c = a.top(); // c = 3
a.pop(); // 1 2
a.push(4); // 1 2 4
c = a.top(); // c = 4

  栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

  队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

  以上是从数据结构角度来看,从操作系统角度来看,所有的数据结构都是对虚拟内存的操作,堆是堆,栈是栈,栈指的是C语言函数所使用的自动有函数回收的虚拟内存空间,而堆则有操作系统堆管理器来管理的那部分虚拟内存,从C语言角度来看,使用malloc函数动态分配的内存,就是堆内存。

  “堆栈”实际上是分为两部分:
  堆是指系统可以动态申请和释放的一部分究竟,这部分是可以用代码进行操作的。
  栈是函数之间调度所使用的一部分空间,这部分在代码上没有明显的表示。
  对于堆来与,可以使用malloc、realloc语句进行申请空间,通常情况下申请得到的是堆空间中的一块区域,而通常情况下定义的数组也会使用堆空间。通常情况下,由代码申请得到的空间需要使用对应的代码进行释放,否则会造成内存泄漏。
  对于栈来与,主函数在调用子函数之前,系统会自动将主函数所使用的寄存器参数等入栈,调用子函数完毕后再将参数出栈,实现了主函数和子函数之间的寄存器复用功能。
  

要讲C语言的堆栈,要从计算机的数据内存分配讲起.
____________________
| Stack区(数组,指针,结构体,局部变量)
____________________
| Static变量(静态变量,全局变量)
____________________
| Heep区(堆区)
____________________
| 代码段
____________________
从上面示意图中可看出整个内存分配,堆分配是在内存中按块划分,也就是相对与函数malloc,realloc,calloc.这3个函数为内存分配函数.而且需要手动调用free函数释放资源,否则会造成大量的内存碎片.

如果楼主不相信可以自己写一个死循环,内部调用malloc函数,创建N个内存块,运行一段时间后,绝对会造成系统瘫痪,资源被耗尽.

栈区划分为计算机自身划分,即在函数或局部变量被调用时,系统自动为其分配栈,以后进先出为原则实现变量的保存,在函数调用完毕时,系统会自动释放栈内资源,所以,栈可以说是短命的(生存周期只在调用过程中).

这里只是粗略说了下堆和栈,另外再说下static-->静态区,全局变量或静态变量存放于静态区,只要代码中存在静态变量或全局变量,自动放于静态区,静态区存放的变量生存周期是整个程序结束时才释放.

代码段区,顾名思义存放的是程序代码(暂时先这么理解).

PS:本人原创,最近发现一些人盗用本人回答的问题.特此声明.嘿嘿.

____________________ _________
补充:
我对于C#不是很熟悉,而且我也是从事C开发的,对于面向对象语言应用不是很熟.在这只能给出C++的代码.代码有点长,不知道你能不能看的懂,才写的.

#include <iostream.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <time.h>
#include <stdio.h>
#include <assert.h>
/*
//基于数组的栈的实现
#define N 50
typedef struct Stack{
int top;
int A[N];
}*pStack;
//Pop出栈
int Pop(pStack pst)
{
int e;
if(pst->top == -1)
{
cout<<"Stack is empty!"<<endl;
return -1;
}
else
{
e = pst->A[pst->top];
pst->top--;
// cout<<"The element "<<e<<" is pop"<<endl;
return e;
}
}
//Push入栈
void Push(pStack pst)
{
int e;
if(pst->top == N-1)
{
cout<<"Stack is full!"<<endl;
}
else
{
cout<<"Input the push number:";
cin>>e;
pst->top++;
pst->A[pst->top] = e;
}
}
//清空栈
void empty(pStack pst)
{
pst->top = -1;
}
//判断栈是否为空
int IsEmpty(pStack pst)
{
if(pst->top == -1)
{
return 0;
// cout<<"The Stack is empty!"<<endl;
}
else
{
return 1;
// cout<<"The Stack is not empty!"<<endl;
}
}
//判断栈是否为满
int IsFull(pStack pst)
{
if(pst->top == N-1)
{
return 0;
}
else
{
return 1;
}
}
//初始化栈
void InitStack(pStack pst)
{
pst->top = -1;
}

void main()
{
Stack S;
InitStack(&S);
int n;
cout<<"How many times do you want to Push:";
cin>>n;
for(int i=0; i<n; i++)
{
Push(&S);
}
cout<<"How many times do you want to Pop:";
cin>>n;
for(i=0; i<n; i++)
{
cout<<"The element "<<Pop(&S)<<" is pop"<<endl;
}
cout<<"The Stack's stutor:"<<endl;

if(IsEmpty(&S) == 0)
{
cout<<"The Stack is empty!"<<endl;
}
else
{
cout<<"The Stack is not empty!"<<endl;
}

if(IsFull(&S) == 0)
{
cout<<"The Stack is full!"<<endl;
}
else
{
cout<<"The Stack is not full!"<<endl;
}

empty(&S);

cout<<"The Stack's stutor:"<<endl;
if(IsEmpty(&S) == 0)
{
cout<<"The Stack is empty!"<<endl;
}
else
{
cout<<"The Stack is not empty!"<<endl;
}
}
*/
typedef struct Stack{
Stack *prior;
Stack *next;
int element;
}*pStack;
//压栈
void Push(pStack *pst)
{
if((*pst) == NULL)
{
pStack S = (pStack)malloc(sizeof(Stack));
(*pst) = S;
(*pst)->next = NULL;
(*pst)->prior = NULL;
cout<<"Input the PUSH data:";
cin>>(*pst)->element;
}
else
{
pStack S = (pStack)malloc(sizeof(Stack));
(*pst)->next = S;
S->prior = (*pst);
S->next = NULL;
(*pst) = S;
cout<<"Input the PUSH data:";
cin>>(*pst)->element;
}
}
//判断是否为空
int IsEmpty(pStack pst)
{
if(pst == NULL)
{
cout<<"The Stack is empty!"<<endl;
return 1;
}
return 0;
}
//出栈
pStack Pop(pStack *pst)
{
if(IsEmpty((*pst)) == 1)
return (*pst);
pStack S = (*pst);
if((*pst)->prior == NULL)
{
cout<<"Out:"<<(*pst)->element<<endl;
(*pst) = NULL;
free(S);
return (*pst);
}
else
{
cout<<"Out:"<<(*pst)->element<<endl;
(*pst) = (*pst)->prior;
(*pst)->next = NULL;
free(S);
return (*pst);
}
}
//初始化栈
void InitStack(pStack pst)
{
pst = NULL;
}

void main()
{
pStack pS = NULL;
// InitStack(pS);
int n;
cout<<"How many times do you want to Push:";
cin>>n;
for(int i=0; i<n; i++)
{
Push(&pS);
}
pStack S;
S = Pop(&pS);
}

呵呵
一种数据存储结构,建议你看看《C语言版--数据结构》这本书!
如果你想对C有更深的了解的话

http://baike.baidu.com/view/93201.html


博山区17610774206: C语言中的栈、堆是什么? -
瞿光香菊: C语言中的堆和栈都是一种数据项按序排列的数据结构. 栈就像装数据的桶或箱子 我们先从大家比较熟悉的栈说起吧,它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取. 这就如同我们要取出放在箱子里面底下的...

博山区17610774206: 计算机C语言里堆栈是什么?和普通意义上的栈有什么不同之处? -
瞿光香菊: 栈和队列是受限制的线性表 栈是先进后出(一群人走进了死胡同,然后再都出来) 队列是先进先出(跟排队一个道理,先来的先受到服务) 线性表是哪里都可以进行插入和删除

博山区17610774206: c语言中什么是堆栈,堆栈的具体应用,求高手帮我解释下,最好能详细点,谢谢 -
瞿光香菊: 也就是一个井喽,然后丢石头进去,要的话就从最上面的拿上来.如 abc要进栈,则: 元素 栈中的元素 1.a进栈. cb a 2.可以a出栈也可以b进栈. c ba 3.可以b出栈也可以c进栈. 无 cba 如果按照示例的话,3次后abc都进入栈了,则从上往下的...

博山区17610774206: c语言堆栈到底是怎么回事啊 ? -
瞿光香菊: 堆栈就是先进后出的特殊数组,先进的数据放在栈底,后进的数据放在栈顶,存取数据只能在栈顶进行.好比几本书叠起来平放桌上,最下面的书是最先放桌上的,最上面的书是最后放上去的,存取的时候只能从最上面的书取,不能从中间、也不能从最下面取....

博山区17610774206: C语言中,什么是栈,什么是堆 -
瞿光香菊: 在c/c++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区.如果你的这两个语句是出现在全局部分,那这个i就是被存储在全局/静态存储区;如果是出现在局部某个函数里,那i就被存储的栈里面.具体可以怎...

博山区17610774206: 谁能帮我说下C语言中的堆栈 -
瞿光香菊: 个人认为楼上的不懂C语言堆栈到底是怎么回事,按楼上说法,只是大概讲了下栈,没有讲堆.要讲C语言的堆栈,要从计算机的数据内存分配讲起. ____________________ | Stack区(数组,指针,结构体,局部变量) ___________________...

博山区17610774206: C,C++中的堆与栈是什么含义? -
瞿光香菊: 堆栈是一种执行“后进先出”算法的数据结构. 设想有一个直径不大、一端开口一端封闭的竹筒.有若干个写有编号的小球,小球的直径比竹筒的直径略小.现在把不同编号的小球放到竹筒里面,可以发现一种规律:先放进去的小球只能后拿出...

博山区17610774206: C的堆栈概念 -
瞿光香菊: 1 这里就是指栈(stack),堆(heap)和栈是两个概念2 你理解的没错,局部变量是在栈上分配的,具有局部作用域,程序自动管理,堆上的数据具有全局作用域,需要手工回收.

博山区17610774206: 为什么调用c语言程序前要设置堆栈?堆栈有什么用?没设置又会怎么样?堆栈是什么?还请各位嵌入式大神讲 -
瞿光香菊: 堆是用来申请不连续内存的数据区域,比如链表,地址不连续,而是通过指针串在一起形成一个连续的结构,c语言中用malloc函数申请的内存都在堆上,申请过不用时记得要用free函数释放掉,不然内存泄露. 而栈的速度比堆的快,数组和局部...

博山区17610774206: C++中的栈和堆是什么? -
瞿光香菊: 两种数据结构.栈就像一叠盘子样,后放的盘子可以先取来用,也就是后进先出,如果类比会计的话,有点像存货后进先出法. 栈在汇编语言里面是用PUSH 与POP操作, 堆好像是正好相反样,先进先出吧是.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网