关于堆栈的学习,初步做了一个十进制转八进制的应用,后面还有两个事检验括号以及运算关系表达式,暂时还没有做出来(因为第一个调了好久)
第一次写blog,希望能借此成为我学习数据结构的工具,希望有大佬能指点我~
#include<stdio.h>
#include<stdlib.h>
#include<exception>
typedef struct Node
{
int Element;
struct Node* Next;
};
typedef struct LStack//链式存储栈
{
Node *Top;
int Length;
};
typedef struct Stack//顺序存储栈,先进后出
{
int *Head;
int Maxsize;
int Top;
};
bool Init(Stack *S,int Maxsize)//初始化顺序栈
{
S->Maxsize=Maxsize;
S->Head=(int*)malloc(S->Maxsize*sizeof(int));
S->Top=-1;
return true;
}
bool Push(Stack *S,int Element)
{
if(S->Top>=S->Maxsize-1)//如果当前栈已经到头了
{
int *p=(int*)realloc(S->Head,S->Maxsize*2*sizeof(int));//直接扩充一倍
if(!p)
{
printf("OverStack...");
return false;
}
S->Maxsize*=2;
S->Top++;//前进一个位置
S->Head[S->Top]=Element;
return false;
}
else
{
S->Top++;
S->Head[S->Top]=Element;
return true;
}
}
int Pop(Stack *S)
{
if(S->Top<=-1)//如果到达了底端,退出程序
{
printf("Pop 你ma呢?");
exit(1);
}
int Element=S->Head[S->Top];
S->Top--;
return Element;
}
bool LInit(LStack *S)//初始化链栈
{
S->Top=NULL;
S->Length=0;
return true;
}
bool LPush(LStack *S,int Element)//链栈的压入
{
Node *p;
p=(Node*)malloc(sizeof(Node));
if(!p)
return false;
p->Element=Element;
p->Next=S->Top;//由于后进先出直接压入首节点
S->Top=p;
S->Length++;
return true;
}
int LPop(LStack *S)//链栈的取顶
{
int Element;
Node *p=S->Top;
Element=S->Top->Element;
S->Top=S->Top->Next;
free(p);
S->Length--;
return Element;
}
bool Recursion8(Stack*S,int Num)//顺序栈递归计算8进制
{
Push(S,Num%8);//把余数压入栈中
if((int)Num/8==0)//然后检验除数是否为0
return true;
Recursion8(S,(int)Num/8);//递归运算重复以上操作,直到商为0
}