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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

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

這里說一下 :網上和書上都有這種寫法 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; //在構造之前和銷毀之后,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; //內存分配失敗

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;

}

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

int ClearStack(SqStack *p) {

p->top= p->base;

return OK;

}

//返回順序棧的元素個數

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;

}

//從棧頂到棧底對每個元素調用某個函數

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

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

while (p.top > p.base)

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

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分配內存地址

InitStack(pstack); //初始化棧

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

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

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("棧中的元素個數為:%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;這句有必要加上嗎?? 答案是肯定的。

這一個問題的關鍵在于 realloc 是怎么實現的,有兩種情況:

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

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

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

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

那么就ok。得到的是一塊連續的內存。

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

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

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

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

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

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

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

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

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

正確的用法應該是?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;

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

php模擬順序棧基本操作

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

C&plus;&plus;語言實現順序棧

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

把十進制整數轉換為r&lpar;r&equals;2&rpar;進制輸出&lpar;順序棧實現&rpar;

上周的第二個作業補上~~ 上周的要求: 1.給出順序棧的存儲結構定義. 2.完成順序棧的基本操作函數. 1)????? 初始化順序棧 2)????? 實現入棧和出棧操作 3)????? 實現取棧頂元素 ...

數據結構之順序棧SqStack

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

數據結構——Java實現順序棧

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

數據結構(C實現)------- 順序棧

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

C語言實現順序棧以及棧的特點

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

隨機推薦

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

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

Kakfa揭秘 Day9 KafkaReceiver源碼解析

Kakfa揭秘 Day9 KafkaReceiver源碼解析 上一節課中,談了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. 執行?sudo apt-get update 2. 安裝?sudo apt-get install openssh-server 3.查看ssh服務狀態 sudo service ssh sta ...

Dwr 框架簡單實例

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

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

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

sudo實例--企業生產環境用戶權限集中管理方案實例

根據角色的不同,給不同的用戶分配不同的角色1.創建初級工程師3個,網絡工程師1個,中級工程師1個,經理1個????? #? 批量創建用戶 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}. 現在給出a1,a2,a3, ...

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。