期末数据结构实验考察我选的是顺序栈的算法实现,结合其他博客便创作了这篇文章,以供大家参考。如有错误,请斧正!!!
顺序栈的算法实现:重点在于理解栈的先进后出的特性,回顾课程中对栈的具体应用,例如数制转换、表达式的求值、括号匹配等应用。
引入了栈底指针base!
抽象类型定义:
typedef struct {
ElemType *base; // 栈底指针
ElemType *top; // 栈顶指针
int stack_size; // 栈的最大长度
} SqStack;
void menu()
{
printf("==========================顺序栈的算法实现==========================\n");
printf("**********************1.创建新栈 2.遍历栈**********************\n");
printf("**********************3.取栈顶 4.销毁栈**********************\n");
printf("**********************5.取栈长度 0.退出**********************\n");
}
Status Create(SqStack *S)
{
int n,e,i;
printf("初始化栈S......\n");
InitStack(S);
printf("成功初始化\n");
printf("输入栈的长度 :");
scanf("%d", &n);
for (i = 1; i <= n; i++) {
printf("请输入第%d个元素:",i);
scanf("%d", &e);
PushStack(S, e);
}
printf("栈为空吗?\n");
if (EmptyStack(S)) {
printf("Yes!\n");
} else {
printf("No!\n");
}
return 1;
Status StackTraverse(SqStack *S) {
ElemType *p;
if (S->top == S->base) {
printf("Stack is NULL.\n");
return 0;
}
p = S->top;
// 由栈顶依次向下遍历
printf("栈顶到栈低元素依次为:");
while (p > S->base) {
p--;
printf("%d ", *p);
}
printf("\n");
return 1;
}
Status GetTopStack(SqStack *S) {
ElemType *t;
if (S->top == S->base) {
return 0;
}
t = (S->top-1);
printf("栈顶元素为:%d\n",*t);
return 1;
}
Status DestroyStack(SqStack *S) {
free(S->base);
S->base = S->top = NULL;
S->stack_size = 0;
printf("栈已成功销毁!\n");
return 1;
}
6.LengthStack(S)
功能:获取栈的长度
Status LengthStack(SqStack *S) {
if (S->top == S->base) {
return 0;
}
printf("当前栈的长度为:%d\n",(Status) (S->top - S->base));
return 1;
}
#include
#include
#define Stack_Init_Size 10 // 初始化栈的最大长度
#define StackIncrement 10 // 若栈最大空间不够时,需要增加的长度
typedef int ElemType;
typedef int Status;
typedef struct {
ElemType *base; // 栈底指针
ElemType *top; // 栈顶指针
int stack_size; // 栈的最大长度
} SqStack;
// 初始化栈
Status InitStack(SqStack *S) {
// 分配初始空间
S->base = (ElemType *) malloc(Stack_Init_Size * sizeof(ElemType)); //动态分配存储空间
if (!S->base) {
exit(0);
}
S->top = S->base; /// 栈顶与栈底相同
S->stack_size = Stack_Init_Size; // 栈的最大长度等于初始长度
return 1;
}
// 判断栈是否为空,只需要判断栈顶指针与栈底指针是否相同即可
Status EmptyStack(SqStack *S) {
return S->base == S->top;
// 获取栈的实际长度,栈顶减去栈底指针即为栈的长度
Status LengthStack(SqStack *S) {
if (S->top == S->base) {
return 0;
}
printf("当前栈的长度为:%d\n",(Status) (S->top - S->base));
return 1;
}
// 获取栈顶的元素,参数e用来存放栈顶的元素
Status GetTopStack(SqStack *S) {
ElemType *t;
if (S->top == S->base) {
return 0;
}
t = (S->top-1);
printf("栈顶元素为:%d\n",*t);
return 1;
}
// 进栈,参数e是要进栈的元素
Status PushStack(SqStack *S, ElemType e) {
// 若栈的最大长度不会够用时,重新开辟,增大长度
if (S->top - S->base >= S->stack_size) {
S->base = (ElemType *)realloc(S->base, (S->stack_size + StackIncrement) * sizeof(ElemType));
if (!S->base) {
return 0;
}
// 栈顶指针为栈底指针加上栈之前的最大长度
S->top = S->base + S->stack_size;
// 栈当前的最大长度等于栈之前的最大长度与增加的长度之和
S->stack_size += StackIncrement;
}
*S->top++ = e; // 先赋值,后栈顶指针上移
return 1;
}
// 出栈,参数e用来存放出栈的元素
Status PopStack(SqStack *S, ElemType *e) {
if (S->base == S->top) {
return 0;
}
*e = *--S->top; // 栈顶指针先下移,后赋值
return *e;
}
// 销毁栈,释放栈空间,栈顶栈底指针置为NULL,长度置为0
Status DestroyStack(SqStack *S) {
free(S->base);
S->base = S->top = NULL;
S->stack_size = 0;
printf("栈已成功销毁!\n");
return 1;
}
// 遍历栈,依次打印每个元素
Status StackTraverse(SqStack *S) {
ElemType *p;
if (S->top == S->base) {
printf("Stack is NULL.\n");
return 0;
}
p = S->top;
// 由栈顶依次向下遍历
printf("栈顶到栈低元素依次为:");
while (p > S->base) {
p--;
printf("%d ", *p);
}
printf("\n");
return 1;
}
Status Create(SqStack *S)
{
int n,e,i;
printf("初始化栈S......\n");
InitStack(S);
printf("成功初始化\n");
printf("输入栈的长度 :");
scanf("%d", &n);
for (i = 1; i <= n; i++) {
printf("请输入第%d个元素:",i);
scanf("%d", &e);
PushStack(S, e);
}
printf("栈为空吗?\n");
if (EmptyStack(S)) {
printf("Yes!\n");
} else {
printf("No!\n");
}
return 1;
}
void menu()
{
printf("==========================顺序栈的算法实现==========================\n");
printf("**********************1.创建新栈 2.遍历栈**********************\n");
printf("**********************3.取栈顶 4.销毁栈**********************\n");
printf("**********************5.取栈长度 0.退出**********************\n");
}
void main() {
SqStack q, *S;
S = &q;
int i, n;
int choice;
InitStack(S);
while(1)
{
menu();
printf("请输入菜单序号:\n");
scanf("%d",&choice);
if(choice==0) break;
switch(choice)
{
case 1: Create(S);break;
case 2:StackTraverse(S);break;
case 3: GetTopStack(S);break;
case 4:DestroyStack(S);break;
case 5:LengthStack(S);break;
default:printf("输入错误!!!\n");
}
system("pause");
}
}