詳解C語言之堆棧
一、何為堆棧?
a.堆棧是一種特殊的線性表
b.堆棧的數(shù)據(jù)元素以及數(shù)據(jù)元素間的邏輯關(guān)系和線性表完全相同,其不同點(diǎn)是:線性表允許在任意位置插入和刪除數(shù)據(jù)元素,但堆棧只允許在固定一端進(jìn)行插入和刪除數(shù)據(jù)元素,所以棧又稱為“先進(jìn)后出”(FILO)或“后進(jìn)先出”(LIFO)的線性表
c.堆棧中允許進(jìn)行插入和刪除數(shù)據(jù)元素的一端稱為棧頂,另一端稱為棧底
d.堆棧的插入操作通常稱為進(jìn)?;蛉霔?;堆棧的刪除操作通常稱為出?;蛲藯?br />

二、思維導(dǎo)圖

三、代碼
1、順序堆棧
#include <stdio.h>
typedef int DataType;
#define MaxStackSize 64
typedef struct
{
DataType stack[MaxStackSize];
int top;
}SeqStack;
//初始化
void StackInit(SeqStack *S)
{
S->top = 0;
}
//判斷是否棧空
int StackIsEmpty(SeqStack S)
{
if (S.top <= 0)
return 0;
else
return 1;
}
//入棧
int StackPush(SeqStack *S, DataType x)
{
if (S->top >= MaxStackSize)
{
printf("棧滿,無法進(jìn)棧?。?!\n");
return 0;
}
else
{
S->stack[S->top] = x;
S->top++;
return 1;
}
}
//出棧
int StackPop(SeqStack *S, DataType *x)
{
if (S->top <= 0)
{
printf("堆棧已空,無法出棧?。。n");
return 0;
}
else
{
S->top--;
*x = S->stack[S->top];
return 1;
}
}
//獲取棧頂元素
int StackGetTop(SeqStack S, DataType *x)
{
if (S.top <= 0)
{
printf("堆棧已空?。?!\n");
return 0;
}
else
{
*x = S.stack[S.top - 1];
return 1;
}
}
int main()
{
SeqStack myStack;
int i, x;
StackInit(&myStack);
for (i = 0; i < 10; i++)
StackPush(&myStack, i + 1);
StackGetTop(myStack, &x);
printf("當(dāng)前棧頂元素為:%d\n", x);
printf("依次出棧:");
while (StackIsEmpty(myStack))
{
StackPop(&myStack, &x);
printf("%d ", x);
}
system("pause");
return 0;
}
2、鏈?zhǔn)蕉褩?/h3>
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct snode
{
DataType data;
struct snode *next;
}LSNode;
//初始化
void StackInit(LSNode **top)
{
*top = (LSNode *)malloc(sizeof(LSNode));
(*top)->next = NULL;
}
//判斷堆棧是否非空
int StackIsEmpty(LSNode *top)
{
if (top->next == NULL)
return 0;
else
return 1;
}
//入棧
void StackPush(LSNode *top, DataType x)
{
LSNode *p;
p = (LSNode *)malloc(sizeof(LSNode));
p->data = x;
p->next = top->next;
top->next = p;
}
//出棧
int StackPop(LSNode *top, DataType *x)
{
LSNode *p = top->next;
if (p == NULL)
{
printf("堆棧已空,刪除錯(cuò)誤?。?!\n");
return 0;
}
top->next = p->next;
*x = p->data;
free(p);
return 1;
}
//獲取棧頂元素
int StackGetTop(LSNode *top, DataType *x)
{
LSNode *p = top->next;
if (p == NULL)
{
printf("堆棧已空,取出錯(cuò)誤!?。n");
return 0;
}
*x = p->data;
return 1;
}
//釋放內(nèi)存空間
void StackDestroy(LSNode **top)
{
LSNode *p, *q;
p = *top;
while (p != NULL)
{
q = p;
p = p->next;
free(q);
}
*top = NULL;
}
int main()
{
int i, x;
LSNode *top;
StackInit(&top);
for (i = 0; i < 10; i++)
StackPush(top, i + 1);
StackGetTop(top, &x);
printf("當(dāng)前棧頂元素為%d\n", x);
printf("依次出棧:");
while (StackIsEmpty(top))
{
StackPop(top, &x);
printf("%4d", x);
}
StackDestroy(&top);
system("pause");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct snode
{
DataType data;
struct snode *next;
}LSNode;
//初始化
void StackInit(LSNode **top)
{
*top = (LSNode *)malloc(sizeof(LSNode));
(*top)->next = NULL;
}
//判斷堆棧是否非空
int StackIsEmpty(LSNode *top)
{
if (top->next == NULL)
return 0;
else
return 1;
}
//入棧
void StackPush(LSNode *top, DataType x)
{
LSNode *p;
p = (LSNode *)malloc(sizeof(LSNode));
p->data = x;
p->next = top->next;
top->next = p;
}
//出棧
int StackPop(LSNode *top, DataType *x)
{
LSNode *p = top->next;
if (p == NULL)
{
printf("堆棧已空,刪除錯(cuò)誤?。?!\n");
return 0;
}
top->next = p->next;
*x = p->data;
free(p);
return 1;
}
//獲取棧頂元素
int StackGetTop(LSNode *top, DataType *x)
{
LSNode *p = top->next;
if (p == NULL)
{
printf("堆棧已空,取出錯(cuò)誤!?。n");
return 0;
}
*x = p->data;
return 1;
}
//釋放內(nèi)存空間
void StackDestroy(LSNode **top)
{
LSNode *p, *q;
p = *top;
while (p != NULL)
{
q = p;
p = p->next;
free(q);
}
*top = NULL;
}
int main()
{
int i, x;
LSNode *top;
StackInit(&top);
for (i = 0; i < 10; i++)
StackPush(top, i + 1);
StackGetTop(top, &x);
printf("當(dāng)前棧頂元素為%d\n", x);
printf("依次出棧:");
while (StackIsEmpty(top))
{
StackPop(top, &x);
printf("%4d", x);
}
StackDestroy(&top);
system("pause");
return 0;
}
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C/C++獲取主機(jī)網(wǎng)卡MAC地址的三方法
MAC地址(Media Access Control address),又稱為物理地址或硬件地址,是網(wǎng)絡(luò)適配器(網(wǎng)卡)在制造時(shí)被分配的全球唯一的48位地址,通過獲取MAC地址可以判斷當(dāng)前主機(jī)的唯一性可以與IP地址綁定并實(shí)現(xiàn)網(wǎng)絡(luò)準(zhǔn)入控制,本文給大家介紹了使用C/C++獲取主機(jī)網(wǎng)卡MAC地址的三方法2023-11-11
Qt槽函數(shù)會(huì)被執(zhí)行多次的問題原因及解決方法
本文主要介紹了Qt槽函數(shù)會(huì)被執(zhí)行多次的問題原因及解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01

