这题借助一个栈是什么意思? 数据结构出栈入栈程序
栈是什么意思?
栈,又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。
向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
扩展资料:
1、栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
2、栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
另外,栈数据在多个线程或者多个栈之间是不可以共享的,但是在栈内部多个值相等的变量是可以指向一个地址的,详见第3点。
堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
参考资料:百度百科-栈
堆栈是什么意思
不知道你指的堆栈是真实的堆栈还是函数调用。
前者很容易,只要通过堆栈头就可以一路向下找到堆栈尾,用个变量数目统计就可以了。
至于函数调用只是用了一个比喻而已,这个堆栈是由编译器完成的,这可能是你调用函数嵌套太多,或者陷入调用的死循环,从而引起堆栈溢出。
至于检查堆栈是否溢出,不管你是以上哪种原因引起的,一旦堆栈溢出,程序就会崩溃,即使捕捉异常也无济于事,合理使用内存及编码是防止堆栈溢出的唯一途径。
详细来讲比较复杂,有问题可以给我发消息留言
数据结构定义一个栈并实现入栈和出栈操作的程序,是什么?
如下:
#include "stdio.h"
struct stackNode{
int data;
struct stackNode *nextPtr;
};
typedef struct stackNode LISTSTACK;
typedef LISTSTACK *STACKNODEPTR;
void push(STACKNODEPTR *,int);
int pop(STACKNODEPTR *);
int isEmpty(STACKNODEPTR);
void printStack(STACKNODEPTR);
void instruct();
int main()
{
int item;
int choice;
STACKNODEPTR sPtr=NULL;
instruct();
printf("choose your choice\n");
scanf("%d",&choice);
while(choice!=3)
{
switch(choice)
{
case 1:
printf("please input an integer!\n");
scanf("%d",&item);
//printf("%d\n",item);
push(&sPtr,item);
printStack(sPtr);
break;
case 2:
if(!isEmpty(sPtr))
{
printf("deleting element of top stack\n");
pop(&sPtr);
printStack(sPtr);
}
else{
printf("no element in the stack\n");
}
break;
default:
printf("invalid input,check your input!\n");
break;
}
printf("pleace choose your choice ");
instruct();
scanf("%d",&choice);
}
}
void instruct()
{
printf("Following the instruction below:\n"
"1:insert new elment into the stack\n"
"2:delete the top element of the stack\n"
"3:to end of run\n");
}
int isEmpty(STACKNODEPTR sPtr)
{
return sPtr==NULL;
}
void printStack(STACKNODEPTR sPtr)
{
if(sPtr==NULL)
{
printf("The stack is empty!\n");
}
else{
printf("The elements of the stack:\n");
while(sPtr!=NULL)
{
printf("%d-->",sPtr->data);
sPtr=sPtr->nextPtr;
}
printf("NULL\n\n");
}
}
void push(STACKNODEPTR *topPtr,int value)
{
STACKNODEPTR newPtr;
newPtr=malloc(sizeof(STACKNODEPTR));
if(newPtr!=NULL)
{
newPtr->data=value;
newPtr->nextPtr=*topPtr;
*topPtr=newPtr;
}
else
{
printf("%d is not inserted into stack.No memory is availiable\n");
}
}
int pop(STACKNODEPTR *topPtr)
{
STACKNODEPTR newPtr;
int topValue;
newPtr=*topPtr;
*topPtr=(*topPtr)->nextPtr;
free(newPtr);
topValue=(*topPtr)->data;
printf("deleting--- %d\n",topValue);
return topValue;
}
数据结构:
是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
常用数据结构:
数组 (Array)、栈 (Stack)、队列 (Queue)、链表 (Linked List)、树 (Tree)、图 (Graph)、堆 (Heap)、散列表 (Hash)
程序中的栈和队列是什么意思
栈(Stack)是仅限制在表的一端进行插入和删除运算的线性表,称插入、删除这一端为栈顶,另一端称为栈底。表中无元素时为空栈。栈 的修改是按后进先出的原则进行的,我们又称栈为LIFO表(Last In First Out)。通常栈有顺序栈和链栈两种存储结构。 栈的基本运算有六种: ·构造空栈:InitStack(S) ·判栈空: StackEmpty(S) ·判栈满: StackFull(S) ·进栈: Push(S,x) ·退栈: Pop(S) ·取栈顶元素:StackTop(S) 在顺序栈中有"上溢"和"下溢"的现象。 ·"上溢"是栈顶指针指出栈的外面是出错状态。 ·"下溢"可以表示栈为空栈,因此用来作为控制转移的条件。 顺序栈中的基本操作有六种:·构造空栈·判栈空·判栈满·进栈·退栈·取栈顶元素 链栈则没有上溢的限制,因此进栈不要判栈满。链栈不需要在头部附加头结点,只要有链表的头指针就可以了。 链栈中的基本操作有五种:·构造空栈·判栈空·进栈·退栈·取栈顶元素 队列(Queue)是一种运算受限的线性表,插入在表的一端进行,而删除在表的另一端进行,允许删除的一端称为队头(front),允许插入的 一端称为队尾(rear) ,队列的操作原则是先进先出的,又称作FIFO表(First In First Out) 。队列也有顺序存储和链式存储两种存储结 构。 队列的基本运算有六种: ·置空队:InitQueue(Q) ·判队空:QueueEmpty(Q) ·判队满:QueueFull(Q) ·入队:EnQueue(Q,x) ·出队:DeQueue(Q) ·取队头元素:QueueFront(Q) 顺序队列的"假上溢"现象:由于头尾指针不断前移,超出向量空间。这时整个向量空间及队列是空的却产生了"上溢"现象。 为了克服"假上溢"现象引入循环向量的概念,是把向量空间形成一个头尾相接的环形,这时队列称循环队列。 判定循环队列是空还是满,方法有三种: ·一种是另设一个布尔变量来判断; ·第二种是少用一个元素空间,入队时先测试((rear+1)%m = front)? 满:空; ·第三种就是用一个计数器记录队列中的元素的总数。 队列的链式存储结构称为链队列,一个链队列就是一个操作受限的单链表。为了便于在表尾进行插入(入队)的操作,在表尾增加一个尾指 针,一个链队列就由一个头指针和一个尾指针唯一地确定。链队列不存在队满和上溢的问题。在链队列的出队算法中,要注意当原队中只 有一个结点时,出队后要同进修改头尾指针并使队列变空。