这题借助一个栈是什么意思? 数据结构出栈入栈程序

7535℃ TERESA

这题借助一个栈是什么意思?数据结构出栈入栈程序

栈是什么意思?

栈,又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。

向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

栈按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

扩展资料:

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)? 满:空; ·第三种就是用一个计数器记录队列中的元素的总数。 队列的链式存储结构称为链队列,一个链队列就是一个操作受限的单链表。为了便于在表尾进行插入(入队)的操作,在表尾增加一个尾指 针,一个链队列就由一个头指针和一个尾指针唯一地确定。链队列不存在队满和上溢的问题。在链队列的出队算法中,要注意当原队中只 有一个结点时,出队后要同进修改头尾指针并使队列变空。