顺序栈的实验报告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()試圖直接從堆上現存的數據后面的那些字節(jié)中獲得附加的字節(jié),如果能夠滿足,自然天下太平。
也就是說,如果原先的內存大小后面還有足夠的空閑空間用來分配,加上原來的空間大小= newsize。
那么就ok。得到的是一塊連續(xù)的內存。
如果原先的內存大小后面沒有足夠的空閑空間用來分配,那么從堆中另外找一塊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_S 順序棧的基本操作
//??main.cpp #include? using?namespace?std; #include?"Status.h" typedef?in ...
鏈棧的基本操作(C語言)
棧的鏈式儲存結構稱為鏈棧.鏈棧的節(jié)點類型與鏈式線性表的節(jié)點類型 定義相同,不同的是它是僅在表頭進行操作的單鏈表.鏈棧通常用不帶頭節(jié) 點的單鏈表來實現,棧頂指針就是鏈表的頭指針 ,如圖所示: 代碼如下: ...
php模擬順序?;静僮?/p>
php模擬順序?;静僮?一.總結 寫函數什么永遠記住邊界情況:比如?echo "棧已滿!
" ;? 棧已空這種,那就能多考慮幾種情況,代碼就很正宗了 1.對象 ...
C++語言實現順序棧
C++語言實現順序棧 在寫C語言實現順序棧的時候,我已經向大家介紹了棧的特點以及介紹了棧的相關操作,并利用C語言實現了相關算法.在這里小編就不在繼續(xù)給大家介紹了,需要溫習的可以去我的博客看看.在這篇博 ...
把十進制整數轉換為r(r=2)進制輸出(順序棧實現)
上周的第二個作業(yè)補上~~ 上周的要求: 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*B Problem II(矩陣)
A*B Problem II 時間限制:1000?ms ?|? 內存限制:65535?KB 難度:1 ? 描述 ACM的C++同學有好多作業(yè)要做,最頭痛莫過于線性代數了,因為每次做到矩陣相乘的時候,大 ...
Kakfa揭秘 Day9 KafkaReceiver源碼解析
Kakfa揭秘 Day9 KafkaReceiver源碼解析 上一節(jié)課中,談了Direct的方式來訪問kafka的Broker,今天主要來談一下,另一種方式,也就是KafkaReceiver. 初始化 ...
HDU 2266 How Many Equations Can You Find(DFS)
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服務狀態(tài) sudo service ssh sta ...
Dwr 框架簡單實例
Dwr 是一個 Java 開源庫,幫助你實現Ajax網站. 它可以讓你在瀏覽器中的Javascript代碼調用Web服務器上的Java,就像在Java代碼就在瀏覽器中一樣. Dwr 主要包括兩部分: ...
cocos2d 2.0和UIKit混合編程, Push CCDirector的時候出現黑屏的天坑
癥狀 使用cocos2d 2.0和UIKit混合編程, 有一塊用cocos2d編寫的小程序, 將CCDirector push到一個UINavigationController里面. 雖然事先在后臺初 ...
sudo實例--企業(yè)生產環(huán)境用戶權限集中管理方案實例
根據角色的不同,給不同的用戶分配不同的角色1.創(chuàng)建初級工程師3個,網絡工程師1個,中級工程師1個,經理1個????? #? 批量創(chuàng)建用戶 for user in chuji{01..03} net01 ...
Eqs - poj 1840(hash)
題意:對于方程:a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 ,有xi∈[-50,50], xi != 0, any i∈{1,2,3,4,5}. 現在給出a1,a2,a3, ...
總結
以上是生活随笔為你收集整理的顺序栈的实验报告c语言,顺序栈的基本操作(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: C#控制台程序中处理2个关闭事件的代码实
- 下一篇: Java、Mysql、MyBatis 中
