日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

顺序栈的实验报告c语言,顺序栈的基本操作(C语言)

發(fā)布時間:2023/12/9 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 顺序栈的实验报告c语言,顺序栈的基本操作(C语言) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

由于現(xiàn)在只學了C語言所以就寫這個C語言版的棧的基本操作

這里說一下 :網(wǎng)上和書上都有這種寫法 int InitStack(SqStack &p)

&p是取地址? 但是這種用法好像C并不支持 ,C++才支持,所以用

C語言寫就需要使用指針

代碼如下:

#include

#include

#define STACK_INIT_SIZE 100//儲存空間初始分配量

#define STACKINCREMENT 10//存儲空間分配增量

#define OK 1

#define ERROR 0

typedef int StackType; //棧元素類型

typedef struct {

StackType *base; //在構(gòu)造之前和銷毀之后,base的值為NULL

StackType *top; //棧頂指針

int stacksize; //當前已分配的存儲空間,以元素為單位

}SqStack; //順序棧

//棧的初始化

int InitStack(SqStack *p) {

p->base = (StackType*)malloc(STACK_INIT_SIZE * sizeof(StackType));

if (p->base == NULL) return ERROR; //內(nèi)存分配失敗

p->top = p->base; //棧頂與棧底相同表示一個空棧

p->stacksize = STACK_INIT_SIZE;

return OK;

}

//判斷棧是否為空

int EmptyStack(SqStack *p) {

//若為空棧 則返回OK,否則返回ERROR

if (p->top == p->base) return OK;

else return ERROR;

}

//順序棧的壓入

int Push(SqStack *p,StackType e) {

//插入元素e為新的棧頂元素

if ((p->top - p->base)>= p->stacksize) //棧滿,追加儲存空間

{

p->base = (StackType*)realloc(p->base, (p->stacksize + STACKINCREMENT) * sizeof(StackType));

if (p->base == NULL) return ERROR;// 儲存空間分配失敗

p->top = p->base + p->stacksize; //可能有人覺得這句有點多余(我當時也是這么想的 后面有解釋)

p->stacksize += STACKINCREMENT;

}

*(p->top) = e;

(p->top)++;

return OK;

}

// 順序棧的彈出

int Pop(SqStack *p,StackType *e) {

//若棧不空,則刪除p的棧頂元素,用e返回其值

if (p->top == p->base) return ERROR;

--(p->top);

*e = *(p->top);

return OK;

}

//順序棧的銷毀

int DestroyStack(SqStack *p) {

//釋放棧底空間并置空

free(p->base);

p->base = NULL;

p->top = NULL;

p->stacksize = ;

return OK;

}

//將順序棧置空 棧還是存在的,棧中的元素也存在,如果有棧中元素的地址任然能調(diào)用

int ClearStack(SqStack *p) {

p->top= p->base;

return OK;

}

//返回順序棧的元素個數(shù)

int StackLength(SqStack p) {

//棧頂指針減去棧底指針等于長度,因為棧頂指針指向當前棧頂元素的下一個位置

return p.top - p.base;

}

//返回順序棧的棧頂元素

int GetTop(SqStack *p, StackType *e) {

//若棧不為空,則用e返回p的棧頂元素

if (p->top > p->base) {

*e = *(p->top - ); return OK;

}

else return ERROR;

}

//從棧頂?shù)綏5讓γ總€元素調(diào)用某個函數(shù)

int StackTraverse(SqStack p,void (*pfun)(StackType)/*函數(shù)指針*/){

//從棧底到棧頂依次對棧中的每個元素調(diào)用函數(shù)pfun()

while (p.top > p.base)

pfun(*(p.base)++); //先調(diào)用后遞增

printf("\n");

return OK;

}

//打印棧中元素

void print(StackType stack) {

printf("%d\n", stack);

}

//測試棧的各種操作

int main() {

int n,i;

StackType *e,a;

SqStack *pstack,stack;

pstack = &stack;

e=(StackType*)malloc(sizeof(StackType)); //為指針e分配內(nèi)存地址

InitStack(pstack); //初始化棧

if (EmptyStack(pstack) == 1) printf("-------棧為空-------\n");

printf("請輸入棧的元素個數(shù):");

scanf("%d", &n);

for (i = ; i < n; i++)

{

scanf("%d", &a);

Push(pstack, a);

}

if (EmptyStack(pstack) == 0) printf("-------棧不為空-----\n");

printf("棧的長度為:%d\n", StackLength(stack));

printf("--------------------\n");

printf("請輸入一個入棧元素:");

scanf("%d", &a);

Push(pstack, a);

printf("--------------------\n");

printf("棧中的元素個數(shù)為:%d\n", StackLength(stack));

printf("--------------------\n");

GetTop(pstack, e);

printf("棧頂元素為:%d\n", *e);

printf("--------------------\n");

printf("打印棧中的元素:\n");

StackTraverse(stack, print);

printf("---彈出棧頂元素---\n");

Pop(pstack, e);

printf("彈出的棧頂元素為:%d\n", *e);

printf("--------------------\n");

GetTop(pstack, e);

printf("棧頂元素為:%d\n", *e);

printf("--------------------\n");

printf("打印棧中的元素:\n");

StackTraverse(stack, print);

printf("--------------------\n");

printf("----------清空棧-------\n");

if (ClearStack(pstack) == ) printf("已清空棧\n");

printf("----------銷毀棧-------\n");

if (DestroyStack(pstack) == ) printf("已銷毀棧\n");

return ;

}

第39行? p->top = p->base + p->stacksize;這句有必要加上嗎?? 答案是肯定的。

這一個問題的關(guān)鍵在于 realloc 是怎么實現(xiàn)的,有兩種情況:

如果有足夠空間用于擴大mem_address指向的內(nèi)存塊,則分配額外內(nèi)存,并返回mem_address。

這里說的是“擴大”,我們知道,realloc是從堆上分配內(nèi)存的,當擴大一塊內(nèi)存空間時,

realloc()試圖直接從堆上現(xiàn)存的數(shù)據(jù)后面的那些字節(jié)中獲得附加的字節(jié),如果能夠滿足,自然天下太平。

也就是說,如果原先的內(nèi)存大小后面還有足夠的空閑空間用來分配,加上原來的空間大小= newsize。

那么就ok。得到的是一塊連續(xù)的內(nèi)存。

如果原先的內(nèi)存大小后面沒有足夠的空閑空間用來分配,那么從堆中另外找一塊newsize大小的內(nèi)存。

并把原來大小內(nèi)存空間中的內(nèi)容復制到newsize中。返回新的mem_address指針。(數(shù)據(jù)被移動了)。老塊被放回堆上。

如果是第二種情況的話,s->top 就不是原來的 top 了???? --百度百科

寫這些代碼的時候還是遇到了一些問題 在這里總結(jié)一下:

第一 對于指針的使用要慎重 因為它傳遞進函數(shù)會改變原始數(shù)據(jù),所以對于不需要改變

指針指向的值的情況就不要使用指針。

第二 對于指針的使用? 如下定義 int *e=NULL; *e=3;

看著好像沒有問題? 編譯也沒問題 但是運行程序就出錯

為什么?? 沒有為指針e分配內(nèi)存地址 所以引用肯定錯誤啊(我這個逗逼錯誤-_-)

正確的用法應(yīng)該是?int *e=NULL;e=(int*)malloc(sizeof(int)); *e=3;

我之前都是 int *e,a; e=&a; e=3; 這種用法 所以......

D&lowbar;S 順序棧的基本操作

//??main.cpp #include? using?namespace?std; #include?"Status.h" typedef?in ...

鏈棧的基本操作&lpar;C語言&rpar;

棧的鏈式儲存結(jié)構(gòu)稱為鏈棧.鏈棧的節(jié)點類型與鏈式線性表的節(jié)點類型 定義相同,不同的是它是僅在表頭進行操作的單鏈表.鏈棧通常用不帶頭節(jié) 點的單鏈表來實現(xiàn),棧頂指針就是鏈表的頭指針 ,如圖所示: 代碼如下: ...

php模擬順序棧基本操作

php模擬順序棧基本操作 一.總結(jié) 寫函數(shù)什么永遠記住邊界情況:比如?echo "棧已滿!
" ;? 棧已空這種,那就能多考慮幾種情況,代碼就很正宗了 1.對象 ...

C&plus;&plus;語言實現(xiàn)順序棧

C++語言實現(xiàn)順序棧 在寫C語言實現(xiàn)順序棧的時候,我已經(jīng)向大家介紹了棧的特點以及介紹了棧的相關(guān)操作,并利用C語言實現(xiàn)了相關(guān)算法.在這里小編就不在繼續(xù)給大家介紹了,需要溫習的可以去我的博客看看.在這篇博 ...

把十進制整數(shù)轉(zhuǎn)換為r&lpar;r&equals;2&rpar;進制輸出&lpar;順序棧實現(xiàn)&rpar;

上周的第二個作業(yè)補上~~ 上周的要求: 1.給出順序棧的存儲結(jié)構(gòu)定義. 2.完成順序棧的基本操作函數(shù). 1)????? 初始化順序棧 2)????? 實現(xiàn)入棧和出棧操作 3)????? 實現(xiàn)取棧頂元素 ...

數(shù)據(jù)結(jié)構(gòu)之順序棧SqStack

順序棧SqStack 基本操作 Status InitStack()//構(gòu)造一個空棧S Status DestroyStack()//銷毀棧S,S不再存在 Status ClearStack()//把 ...

數(shù)據(jù)結(jié)構(gòu)——Java實現(xiàn)順序棧

一.分析 棧是限定僅在表的一端進行插入或刪除操作的線性表,對于棧來說,操作端稱為棧頂,另一端則稱為棧底,棧的修改是按照后進先出的原則進行的,因此又稱為后進先出的線性表. 順序棧是指利用順序存儲結(jié)構(gòu)實現(xiàn) ...

數(shù)據(jù)結(jié)構(gòu)(C實現(xiàn))------- 順序棧

棧是限定僅在表的一端進行插入或刪除的純屬表,通常稱同意插入.刪除的一端為棧頂(Top),對應(yīng)在的.則稱還有一端為棧底(Bottom). 不含元素的棧則稱為空棧. 所設(shè)棧S={a1,a2,a3,..., ...

C語言實現(xiàn)順序棧以及棧的特點

什么是棧? 同順序表和鏈表一樣,棧也是用來存儲邏輯關(guān)系為 "一對一" 數(shù)據(jù)的線性存儲結(jié)構(gòu),如下圖所示. 從上圖我們看到,棧存儲結(jié)構(gòu)與之前所學的線性存儲結(jié)構(gòu)有所差異,這緣于棧對數(shù)據(jù) ...

隨機推薦

nyoj 623 A&ast;B Problem II(矩陣)

A*B Problem II 時間限制:1000?ms ?|? 內(nèi)存限制:65535?KB 難度:1 ? 描述 ACM的C++同學有好多作業(yè)要做,最頭痛莫過于線性代數(shù)了,因為每次做到矩陣相乘的時候,大 ...

Kakfa揭秘 Day9 KafkaReceiver源碼解析

Kakfa揭秘 Day9 KafkaReceiver源碼解析 上一節(jié)課中,談了Direct的方式來訪問kafka的Broker,今天主要來談一下,另一種方式,也就是KafkaReceiver. 初始化 ...

HDU 2266 How Many Equations Can You Find&lpar;DFS&rpar;

How Many Equations Can You Find Time Limit:1000MS???? Memory Limit:32768KB???? 64bit IO Format:%I64d ...

java swing 下拉框與文本框

import java.awt.*; import javax.swing.*; import javax.swing.border.*; import java.awt.event.*; publi ...

ubuntu 上安裝ssh

1. 執(zhí)行?sudo apt-get update 2. 安裝?sudo apt-get install openssh-server 3.查看ssh服務(wù)狀態(tài) sudo service ssh sta ...

Dwr 框架簡單實例

Dwr 是一個 Java 開源庫,幫助你實現(xiàn)Ajax網(wǎng)站. 它可以讓你在瀏覽器中的Javascript代碼調(diào)用Web服務(wù)器上的Java,就像在Java代碼就在瀏覽器中一樣. Dwr 主要包括兩部分: ...

cocos2d 2&period;0和UIKit混合編程&comma; Push CCDirector的時候出現(xiàn)黑屏的天坑

癥狀 使用cocos2d 2.0和UIKit混合編程, 有一塊用cocos2d編寫的小程序, 將CCDirector push到一個UINavigationController里面. 雖然事先在后臺初 ...

sudo實例--企業(yè)生產(chǎn)環(huán)境用戶權(quán)限集中管理方案實例

根據(jù)角色的不同,給不同的用戶分配不同的角色1.創(chuàng)建初級工程師3個,網(wǎng)絡(luò)工程師1個,中級工程師1個,經(jīng)理1個????? #? 批量創(chuàng)建用戶 for user in chuji{01..03} net01 ...

Eqs - poj 1840&lpar;hash&rpar;

題意:對于方程:a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 ,有xi∈[-50,50], xi != 0, any i∈{1,2,3,4,5}. 現(xiàn)在給出a1,a2,a3, ...

總結(jié)

以上是生活随笔為你收集整理的顺序栈的实验报告c语言,顺序栈的基本操作(C语言)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。