❶ 假定栈用单链表的存储结构表示,栈的栈顶指针为top,进行退栈时执行的操作
用c++还是java描述?
假设用c++吧,思想都一样
length--;//栈顶指针后移
Node<T> *currentNode=tail;
Node<T> *tempTail=head;
for(int i=1; i<=length; i++)//这个地方到底是小于还是小于等于自己调试一下吧
tempTail=tempTail->next;//取到出栈后应该为尾节点;
delete tail;
tail=tempTail;//恢复尾节点
return currentNode;
❷ 用链表存储堆栈内容,出栈入栈函数~~我快崩溃了!
1、main函数默认是int,需要一个return 0;
改成void,少一个警告。
void main()
2、typedef应用错误。
typedef struct node * list_pointer;
typedef struct node{
int key;
list_pointer *link;
};改成:
typedef struct node * list_pointer;
struct node{
int key;
list_pointer link;//已经是指针
};
3、list_pointer已经被定义为指针,不用再次指针:
main中:
lp=(list_pointer *)malloc(sizeof(node));
ptr=(list_pointer *)malloc(sizeof(node));
改为:
lp=(list_pointer)malloc(sizeof(node));
ptr=(list_pointer)malloc(sizeof(node));
add中:
p=(list_pointer *)malloc(sizeof(node));//因为你还没有定义
改为
list_pointer p=(list_pointer)malloc(sizeof(node));
4、null在C中没定义,只能用NULL,这是预定义过的
if(b->link==null)return(null);
——〉if(b->link==NULL)return(NULL);
5、deletes中p没有定义:
else
{
list_pointer p;
p=b->link;
x=p->key;
b->link=p->link;
free(p);
return(x);
}
6、deletes定义返回类型不对,应该为:
int deletes(list_pointer b);
7、如今是没错了,但是算法本身就有不可原谅的错误!
#include<stdio.h>
#include<stdlib.h>
#define Max 100
typedef struct node * list_pointer;
struct node{
int key;
list_pointer link;
};
void add(list_pointer a,int n);
int deletes(list_pointer b);
void main()
{
// int i;
list_pointer ptr,lp;
lp=(list_pointer)malloc(sizeof(node));
ptr=(list_pointer)malloc(sizeof(node));
add(ptr,5);
printf("%d",deletes(ptr));
free(ptr);
add(lp,6);
printf("%d",deletes(lp));
free(ptr);
}
void add(list_pointer a,int n){
list_pointer p=(list_pointer)malloc(sizeof(node));
p->key=n;
p->link=a->link;
a->link=p;
}
int deletes(list_pointer b){
int x;
if(b->link==NULL)return(NULL);
else
{
list_pointer p;
p=b->link;
x=p->key;
b->link=p->link;
free(p);
return(x);
}
}
❸ 退栈时的操作
你写退栈函数时多定义一个传参变量,先用gettop将栈顶元素的值赋给这个变量然后再退栈。
并不需要每次出栈都将栈顶的元素的空间释放掉, 释放掉地画下一次元素进栈还得重新分配整个栈的空间,倒腾栈中的数据,那样太费时间. 栈顶指针-1,就表示栈顶元素出栈,并被删除,下一次元素进栈,只要栈顶指针+1,并不会影响栈操作.
栈(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 栈是一种数据结构,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据
❹ 栈的顺序存储和链表存储的差异
顺序存储: 线性表的顺序表:指的是用一组地址连续的存储单元,依次存储线性表的数据元素。
线性表的顺序存储结构具备如下两个基本特征: 1、线性表中的所有元素所占的存储空间是连续的(即要求内存中可用存储单元的地址必须是连续的)。 2、线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。 即:线性表逻辑上相邻、物理也相邻(逻辑与物理统一:相邻数据元素的存放地址也相邻),则已知第一个元素首地址和每个元素所占字节数,则可求出任一个元素首地址。 优点: 1、
无须为表示结点间的逻辑关系而增加额外的存储空间。
2、
可以方便的随机存取表中的任一结点。
3、
存储密度大(=1),存储空间利用率高。 缺点: 1、
插入和删除运算不方便,需移动大量元素。 2、
由于要求占用连续的存储空间,存储分配只能按最大存储空间预先进行,致使存储空间不能得到充分利用。
3、
表的容量难以扩充。 链表存储: 线性表的链式存储:指用一组任意的存储单元存储线性表中的数据元素。
线性表的链式存储结构具备的基本特征: 链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针。 优点: 1、
插入、删除操作很方便,可通过修改结点的指针实现,无须移动元素。
2、
方便扩充存储空间。
缺点: 1、
不能随机存取元素。
2、
存储密度小(<1),存储空间利用率低。 总结: 1、
顺序表适宜于做查找这样的静态操作;
链表宜于做插入、删除这样的动态操作。 2、若线性表的长度变化不大,且其主要操作是查找,则采用顺序表; 若线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。
❺ 以链表作为栈的存储结构,出栈操作必须判别栈空的情况
C 否则会下溢!就是没元素,可是却要取出,所以必须在退栈前进行判断!
❻ 数据结构的题谁能帮解答一下谢谢
1、A 删除链表结点,直接为p->next=p->next->next;
2、B 用链表的话,可以动态分配空间,因此只要考虑是否为空,不会出现满的情况。
3、A 此题目是求子串的问题,意思是求主串第5个开始长度为9的子串
4、B 其实B答案包括了C和D答案,搞清先序、后序的概念应该不难。
5、B 此题相当一个等比数列,1+3+9+27=40 和完全三叉树的概念
1、2n, n+1 此题考的是线索二叉树部分,其中除根结点外所有的结点都必须用指针域连接,应该用到n-1所以当然有N+1个没有被用到。
2、CBA 其实这个题目和前面的那个选择题相似,画出二叉树就只有右孩子的二叉树
3、i=i+1, j=0; 就是子符串的朴素算法
4、ABCDE为层序,画链式很简单,先序:ABDEC,中序:DBEAC后序:DEBCA
5、方程1:n0+n1+n2=n 方程2:n1+2*n2=n-1 得n2=n0-1, 这一问和上面一样同样是n-1个,但是此处应该写成:2*n0+n1-1
6、最少为深度k-1的树再加一个 即:2^(k-1)
7、和前面一样
8、以2为底的log128求整数就行,第二问,三个方程解三个未知数,
方程1:n0+n1+n2=128 方程2:n1+2*n2=128-1 方程3:n1=1 (对于完全二叉树且128为偶数)
9、先画出来,再写,答案:DEBCA
❼ 退栈运算
退栈是将栈顶元素赋值给某个变量,并从栈中去掉(删除)这个栈顶元素,栈中少了一个元素,读栈顶元素时只是将栈顶元素值赋值给某个变量,但是并不去掉栈顶元素,因此栈中元素个数不变。
栈的顺序存储空间为S(1:50),初始状态为top=0。经过一系列入栈与退栈运算后,top=20,则栈顶-栈底=20-0=20个元素。
栈是向上增长的,每次压入一个元素,栈的TOP指针向上移动一位。当压入第一个元素时,TOP指针指向m+1-1 = m当压入第二个元素时,TOP指针指向m+1-2 = m-1。
(7)链表以栈存储退栈时扩展阅读:
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈。
❽ 栈的入栈和出栈的顺序规律是什么
入栈的顺序规律是排在前面的先进,排在后面的后进。
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。
向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
要搞清楚这个概念,首先要明白”栈“原来的意思,如此才能把握本质。栈,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法。
首先系统或者数据结构栈中数据内容的读取与插入(压入push和 弹出pop)是两回事!压入是增加数据,弹出是删除数据 ,这些操作只能从栈顶即最低地址作为约束的接口界面入手操作 ,但读取栈中的数据是随便的没有接口约束之说。
很多人都误解这个理念从而对栈产生困惑。而系统栈在计算机体系结构中又起到一个跨部件交互的媒介区域的作用 即 cpu 与内存的交流通道 ,cpu只从系统给我们自己编写的应用程序所规定的栈入口线性地读取执行指令, 用一个形象的词来形容它就是pipeline(管道线、流水线)。cpu内部交互具体参见 EU与BIU的概念介绍。
❾ 假定栈用单链表的存储结构表示,栈的栈顶指针为top,进行退栈时执行的操作
top->next指向栈顶,top->next->next指向栈顶第二个元素,现在要退栈就是移除栈顶元素,而第二个元素现在变成了栈顶元素了,所以选D
❿ 解释一下C++中链表和链栈的功能和编程思想
链表 是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
线性表的链式存储表示的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。因此,为了表示每个数据元素 与其直接后继数据元素 之间的逻辑关系,对数据元素 来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。由这两部分信息组成一个"结点"(如下图所示),表示线性表中一个数据元素 。
数据域 data 指针域 next
其中存储数据元素信息的域称作数据域(设域名为data),存储直接后继存储位置的域称为指针域(设域名为next)。指针域中存储的信息又称做指针或链。
由分别表示,,…, 的N 个结点依次相链构成的链表,称为线性表的链式存储表示,由于此类链表的每个结点中只包含一个指针域,故又称单链表或线性链表.
=====================================================
三个链表函数(c++)
#include <stdio.h>
#include <stdlib.h>
struct Node{
int data;
Node * next;
};
void insert(Node * root,int idx,int d){
Node * tmp = root;
for(int i = 0;i<idx;i++){
tmp = tmp->next;
if(tmp == NULL) return ;
}
Node * tmp2 = new Node;
tmp2->data = d;
tmp2->next = tmp->next;
tmp->next = tmp2;
}
int del(Node * root,int idx){
Node * tmp = root;
for(int i = 0;i<idx;i++){
tmp = tmp->next;
if(tmp == NULL) return -1;
}
int ret = tmp->next->data;
tmp->next = tmp->next->next;
return ret;
}
void print(Node * root){
for(Node *tmp = root; tmp!=NULL; tmp = tmp->next)
printf("%d ",tmp->data);
printf("\n");
}
int main(){
Node * root;
root = new Node;
root->data = -1;
return 0;
}
链栈,可能你是说错了,
应该是采用链式存储的栈,
栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线形表。
栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
栈是只能在某一端插入和删除的特殊线性表。用桶堆积物品,先堆进来的压在底下,随后一件一件往堆。取走时,只能从上面一件一件取。堆和取都在顶部进行,底部一般是不动的。
栈就是一种类似桶堆积物品的数据结构,进行删除和插入的一端称栈顶,另一堆称栈底。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为后进先出表(LIFO表)。
1、进栈(PUSH)算法
①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);
②置TOP=TOP+1(栈指针加1,指向进栈地址);
③S(TOP)=X,结束(X为新进栈的元素);
2、退栈(POP)算法
①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②);
②X=S(SOP),(退栈后的元素赋给X);
③TOP=TOP-1,结束(栈指针减1,指向栈顶)。