xdu程序设计-堆栈模拟
涉及知识点:内存管理、结构体定义、基本数据结构
要求:
- 编写一个程序模拟堆栈,要求能够模拟、入栈、出栈、返回栈顶元素等基本操作
- 栈中元素可用整数代替 不能使用C++模板库预定义的类型
- 程序运行中可输入多组入栈、出栈操作,每次操作后展示栈中元素
#include<stdio.h> #include<stdlib.h> /* 栈的基本操作 */ # define STACK_INIT_SIZE 100 # define INCREMENT 10 # define OVERFLOW 0 # define ERROR 0 # define OK 1 typedef int Status; typedef int ElemType; /* ElemType类型根据实际情况而定,这里假设为int */ struct SqStack { ElemType *base; //栈底指针,栈构造前和销毁后为空 ElemType *top; //栈顶指针,指向栈顶元素的下一位置 int stacksize; //当前的栈空间大小 }; Status InitStack(SqStack &S)//构造一个空栈 { S.base = (ElemType *) malloc (STACK_INIT_SIZE * sizeof(ElemType)) ; if(!S.base) return (OVERFLOW); S.top = S.base; S.stacksize = STACK_INIT_SIZE ; return OK; }//InitStack Status push(SqStack &S, ElemType e)//入栈 { if (S.top - S.base == S.stacksize) {//栈满,扩充空间 S.base = (ElemType *) realloc(S.base, (S.stacksize+INCREMENT)*sizeof( ElemType)); if (!S.base) return OVERFLOW; S.stacksize ++; S.top = S.base + S.stacksize; } *(S.top) = e; S.top++; return OK; } Status pop(SqStack &S, ElemType &e)//出栈 { if(S.top == S.base) return ERROR; e = *--S.top; return OK; } Status Gettop(SqStack S,ElemType &e)//获取栈顶元素 { if(S.top == S.base) return ERROR; e = *(S.top-1); return OK; } Status StackLength(SqStack S) { return S.top - S.base; } void show(SqStack S) { while(S.base < S.top) { printf("%d ",*S.base); S.base++; } } int main() { int j; SqStack s; int e; if(InitStack(s)) { for(j=1;j<=10;j++) push(s,j); } printf("栈中元素依次为:\n"); show(s); pop(s,e); printf("\n弹出的栈顶元素 e=%d\n",e); Gettop(s,e); printf("栈顶元素 e=%d \n栈的长度为 %d\n",e,StackLength(s)); return 0; }
本题实现了基本的初始化 入栈 出栈以及展示的功能
具体实现出入栈操作时可以规定栈的大小
遇到的问题
- 指针运用:用&s或&e的时候说明要改变其值,函数中处理时用原始s,e即可
- 栈的申请:malloc申请的是一块纯粹的内存,需要通过elemtype*来强制转化其类型为可储存elemtype型的
- 指针++即指向下个指针