码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创 。
欢迎大家阅读我的博客,如果有错误请指正,有问题请提问,我会尽我全力改正错误回答问题。在次谢谢大家。下面开始正式内容
堆栈(英語:stack)又稱為棧或堆棧,是計算機科學中一種特殊的串列形式的抽象資料型別,其特殊之處在於只能允許在鏈結串列或陣列的一端(稱為堆疊頂端指標,英語:top)進行加入數據(英語:push)和輸出數據(英語:pop)的運算。另外棧也可以用一維數組或連結串列的形式來完成。堆疊的另外一個相對的操作方式稱為佇列。
由於堆疊資料結構只允許在一端進行操作,因而按照後進先出(LIFO, Last In First Out)的原理運作。维基百科-堆栈
码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创 。
栈是限制在表的一端进行插入和删除的线性表。允许插入、删除的这一端称为栈顶,另一个固定端称为栈底。当表中没有元素时称为空栈。利用顺序存储方式实现的栈称为顺序栈。由于C语言的数组类型也有随机存取的特点,一维数组的机内表示就是顺序结构。因此,可用C语言的一维数组实现栈的顺序存储。
在此,我们利用C语言的结构体类型定义顺序栈:
#define STACK_INIT_SIZE 100; //栈存储空间的初始分配量
#define STACKINCREMENT 10; //存储空间分配增量
typedef struct{
SElemType *base; //存储数据元素的数组
SElemType *top; //栈顶指针
int stacksize; //当前分配的栈空间大小
//(以sizeof(SElemType)为单位)
}SqStack;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef char SElemType;
#define STACK_INIT_SIZE 100 //栈存储空间的初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
定义常用常量,类型别称
Status InitList_stack (SqStack &s) {//&在这里表示引用
s.base = (SElemType*)malloc( STACK_INIT_SIZE*sizeof(SElemType));
if (!s.base )
exit(0);
s.stacksize = STACK_INIT_SIZE;
s.top = s.base;
return OK;
}// InitList_stack
引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。引用(reference)是c++对c语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名;引用 -百度百科
给顺序栈s分配空间 ,成功返回1,失败则结束程序。 使用顺序栈一定要先初始化再使用
Status EmptyStack (SqStack s) {
if(s.base == s.top)
return TRUE;
else
return FALSE;
}
判断顺序栈s是否为空,空返回1,不空为0
Status GetLength(SqStack s){
return s.top-s.base;
}
返回顺序栈s长度
Status DisplayStack(SqStack &s){
while(s.base != s.top){
printf("%c ",*--(s.top));
}
printf("\n");
return OK;
}
打印顺序栈s中的值到屏幕
Status PushStack(SqStack &s , SElemType e ){
if(s.stacksize<(s.top-s.base) )//溢出
return ERROR;
if(s.stacksize==(s.top-s.base) )
s.base = (SElemType*)malloc(( s.stacksize+STACKINCREMENT)*sizeof(SElemType));
*(s.top) = e;
s.top++;
return OK;
}
将元素e插入顺序栈s入栈,成功返回1,失败返回0
Status OutStack(SqStack &s , SElemType &e){
if(s.top != s.base)
e= *(s.top--);
return OK;
}
将栈顶元素出栈存入e,成功返回1,失败返回0
SElemType TopStack(Stack &s ){
SElemType e;
if(s.top != s.base)
e= *(s.top-1);
return e;
}
获取栈顶元素并返回,不出栈。
Status DestroyStack ( SqStack s) {
if (!s.base)
return ERROR;
free (s.base);
s.base = NULL;
s.top = NULL;
s.stacksize= 0;
return OK;
}// DestroyList_Sq
释放传入的顺序栈,成功返回1,失败返回0
int main(){
SqStack s;
SElemType e;
printf("1)初始化顺序栈;\n");
InitList_stack(s);
printf("2)判断顺序栈是否为空;");
printf(EmptyStack(s)?"ture\n":"flase\n");
printf("3)依次进栈元素a,b,c,d,e;\n");
PushStack(s,'a');
PushStack(s,'b');
PushStack(s,'c');
PushStack(s,'d');
PushStack(s,'e');
printf("4)判断顺序栈是否为空;");
printf(EmptyStack(s)?"ture\n":"flase\n");
printf("5)输出栈长度;");
printf("%d\n",GetLength(s));
printf("6)输出从栈顶到栈底的元素:");
DisplayStack(s);
printf("7)依次进栈元素a,b,c,d,e;\n");
PushStack(s,'a');
PushStack(s,'b');
PushStack(s,'c');
PushStack(s,'d');
PushStack(s,'e');
printf("8)读出栈顶元素,删除栈顶元素;");
OutStack(s,e);
printf("%d\n",GetLength(s));
printf("9)输出从栈顶到栈底的元素;");
DisplayStack(s);
printf("10)判断顺序栈是否为空;");
printf(EmptyStack(s)?"ture\n":"flase\n");
printf("11)释放栈。");
DestroyStack(s);
}
- 维基百科-堆栈
- 百度百科 -引用
码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创 。
#include //EOF,NULL
#include //malloc()
#include //exit()
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef char SElemType;
#define STACK_INIT_SIZE 100 //栈存储空间的初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
typedef struct{
SElemType *base; //存储数据元素的数组
SElemType *top; //栈顶指针
int stacksize; //当前分配的栈空间大小
//(以sizeof(SElemType)为单位)
}SqStack;
Status InitList_stack (SqStack &s) {
s.base = (SElemType*)malloc( STACK_INIT_SIZE*sizeof(SElemType));
if (!s.base )
exit(0);
s.stacksize = STACK_INIT_SIZE;
s.top = s.base;
return OK;
}// InitList_stack
Status EmptyStack (SqStack s) {
if(s.base == s.top)
return TRUE;
else
return FALSE;
}//
Status PushStack(SqStack &s , SElemType e ){
if(s.stacksize<(s.top-s.base) )
return ERROR;
if(s.stacksize==(s.top-s.base) )
s.base = (SElemType*)malloc(( s.stacksize+STACKINCREMENT)*sizeof(SElemType));
*(s.top) = e;
s.top++;
return OK;
}
Status GetLength(SqStack s){
return s.top-s.base;
}
Status DisplayStack(SqStack &s){
while(s.base != s.top){
printf("%c ",*--(s.top));
}
printf("\n");
return OK;
}
Status OutStack(SqStack &s , SElemType &e){
if(s.top != s.base)
e= *(s.top--);
return OK;
}
SElemType TopStack(Stack &s ){
SElemType e;
if(s.top != s.base)
e= *(s.top-1);
return e;
}
Status DestroyStack ( SqStack s) {
if (!s.base)
return ERROR;
free (s.base);
s.base = NULL;
s.top = NULL;
s.stacksize= 0;
return OK;
}// DestroyList_Sq
int main(){
SqStack s;
SElemType e;
printf("1)初始化顺序栈;\n");
InitList_stack(s);
printf("2)判断顺序栈是否为空;");
printf(EmptyStack(s)?"ture\n":"flase\n");
printf("3)依次进栈元素a,b,c,d,e;\n");
PushStack(s,'a');
PushStack(s,'b');
PushStack(s,'c');
PushStack(s,'d');
PushStack(s,'e');
printf("4)判断顺序栈是否为空;");
printf(EmptyStack(s)?"ture\n":"flase\n");
printf("5)输出栈长度;");
printf("%d\n",GetLength(s));
printf("6)输出从栈顶到栈底的元素:");
DisplayStack(s);
printf("7)依次进栈元素a,b,c,d,e;\n");
PushStack(s,'a');
PushStack(s,'b');
PushStack(s,'c');
PushStack(s,'d');
PushStack(s,'e');
printf("8)读出栈顶元素,删除栈顶元素;");
OutStack(s,e);
printf("%d\n",GetLength(s));
printf("9)输出从栈顶到栈底的元素;");
DisplayStack(s);
printf("10)判断顺序栈是否为空;");
printf(EmptyStack(s)?"ture\n":"flase\n");
printf("11)释放栈。");
DestroyStack(s);
}
码文不易,如果帮助到您,希望您可以帮我刷一下点击量,与您无害,与我有益谢谢 支持原创 。