當前位置:首頁 » 服務存儲 » 鏈表以棧存儲退棧時
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

鏈表以棧存儲退棧時

發布時間: 2022-11-22 07:35:27

❶ 假定棧用單鏈表的存儲結構表示,棧的棧頂指針為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,指向棧頂)。