此代码是栈的顺序结构的实现,你叫数组写的也行,都一个样,另外我把令一个我找到的别人的代码也放最下面了,和我写的好像有挺大的区别,也提供给读者借鉴
是在写实验过程中的小练习,如有错误,望指出以改进,在代码中皆有大量的注释帮助你理解。
今天周末,祝你开心
#include//有个小问题,由于程序设计之初就必须要赋值那么如果没有创建,一系列的功能无法使用 #include //但是我改了改,又没啥问题了,总之你注意到就问题不大 using namespace std; #define MAX 20 //这个20是我故意的,就是为了防止最后内个S.top++没有被你注意到 //如果没有被注意到的话,个人认为你的代码仅仅只是个半成品,技术含量不大 typedef struct stack { int* base; int* top; int len; }stack; void create(stack& S);//用于初始化栈 void destroystack(stack& S);//用于销毁栈 void clean(stack& S);//用于清空栈里的数据 void pankong(stack& S);//判断栈是否为空 void outtop(stack S); //获取栈顶元素 !!!我们记住一下这个输出的函数哈,一定不可以使用引用传递哈,引用传递的话会改变top的位置 void charu(stack& S);//用于插入元素 void deleteelem(stack& S);//用于删除栈顶个元素 void outstack(stack S);//输出元素 !!!我们记住一下这个输出的函数哈,一定不可以使用引用传递哈,引用传递的话会改变top的位置 void outlen(stack &S);//感觉是最没用的函数,很显然就能输出长度啊 void jisuan(stack& S);//进行进制转换的函数 void menu(void) { //我觉得我这个菜单写的不赖很经典,写前边了,哈哈哈哈哈 char a01[] = "(1)创建栈"; char a02[] = "(2)销毁栈"; char a03[] = "(3)清空栈"; char a04[] = "(4)判断栈是否为空"; char a05[] = "(5)获取栈顶元素"; char a06[] = "(6)用于插入栈顶元素"; char a07[] = "(7)删除栈顶个元素"; char a08[] = "(8)输出元素"; char a09[] = "(9)输出长度"; char a10[] = "(10)进制转换的函数"; char a11[] = "出入任意不在前面菜单的数字将结束程序"; printf("%-50s", a01); printf("%-50sn", a02); printf("%-50s", a03); printf("%-50sn", a04); printf("%-50s", a05); printf("%-50sn", a06); printf("%-50s", a07); printf("%-50sn", a08); printf("%-50s", a09); printf("%-50sn", a10); printf("%-50sn", a11); } void caidancaozuo(stack& S)//再次自我感觉良好觉得这个自我调用也不赖,放前边了 { cout << "请问你想选择哪个指令" << endl; int mingling; cin >> mingling; switch (mingling) { case 1: { create(S); cout << "您刚才创建的栈是:"< = 0) { *S.top = x; S.len++; if(S.len==20)//realloc函数比较难搞偶,看我下边写的应该对你理解有帮助 { cout<<"您的数组长度已经达到20了,不可以再输了嗷"< >x; switch(x){ case 1: return ; case 2: caidancaozuo(S); default: cout<<"这位同学你怎么乱输啊,我不改程序了,毁灭吧,我退出"< > e; *S.top=e; cout << "您刚才输入的数是" << *S.top << endl; S.top++; S.len++;//放在后面以防止多此加长度 } void deleteelem(stack &S)//经查阅书得出栈居然是只能在顶部进行各种操作,那这个栈岂不是只能删除栈顶嘛 { if(!S.base) { cout<<"初始化都没得,我退出这个函数了"< >a; // cout << "请输入你要把已经存在的函数类型转化成什么进制的数组" << endl; cout<<"请输入一个数字让我们来转化它"< >t; stack newstack; newstack.base = (int*)malloc(100000 * sizeof(int));//我随意开辟的哈,因为我也不知道新创建的数到底能占几位 newstack.top = newstack.base;//注意哈,因为我们要干的事情是在计算机内存的某一段内存空间存放数值, newstack.len=0; while(t/a>=1) { *newstack.top=t%a; t=t/a; newstack.top++; newstack.len++; } //记住记住哈我们要记得把最后小于一的内个最后的商余压入栈中,这个很重要,· *newstack.top=t; newstack.top++; newstack.len++; outstack(newstack); } void outstack(stack S)//用于栈的整体的输出 { if(!S.base) { cout<<"初始化都没得,我退出这个函数了"< 下面是我找的其他人的,额...网站上应该没他的
#include#include #define MAXSIZE 100 typedef int Elemtype; typedef struct node { int* a; int top;//指示栈顶元素在数组中的位置 }stack; stack initstack() {//初始化栈 stack s; s.a=(int*)malloc(MAXSIZE*sizeof(int)); if (!s.a) { printf("内存分配失败n"); exit(0); } s.top = -1; printf("初始化成功!n"); return s; } void destroy(stack* s) {//销毁栈 if (!s->a) { printf("栈已被销毁或还未初始化n"); return; } free(s->a); s->a=NULL; s->top = -1; printf("销毁成功n"); } void length(stack* s) { if (s->top < 0) { printf("栈已空!n"); return; } printf("该栈的长度为%dn", s->top + 1); } void gettop(stack* s) { if (s->top < 0) { printf("栈已空n"); return; } printf("栈顶元素为%dn", s->a[s->top]); } void push(stack* s, Elemtype elem) {//插入栈顶元素 if (s->top >= MAXSIZE - 1) { printf("栈满!n"); return; } s->a[++s->top] = elem; } void pop(stack* s) {//删除栈顶元素 if (s->top < 0) { printf("栈已空!n"); return; } printf("弹栈元素:%dn", s->a[s->top]); s->a[s->top--] = 0; } void isNull(stack* s) { if (s->top < 0) printf("栈已空!n"); else printf("栈未空n"); } void traverse(stack* s) { if (s->top < 0) { printf("栈已空!n"); return; } int i; for (i = 0; i <= s->top; i++) { printf("%dt", s->a[i]); } printf("n"); } void clear(stack* s) { int i; if (s->top<0) { printf("栈已空!n"); return; } for (i = 0; i < s->top; i++) { s->a[i] = 0;//遍历数组,将栈内所有元素置0 } s->top = -1; } void transform() {//进制转换函数 int num, base;//相应进制数 int i; stack a; a=initstack(); stack *s=&a; printf("请输入一个十进制数及要转换的进制数:n"); scanf("%d %d", &num, &base); while (num / base >= 1) { push(s, num % base);//把每次取模的结果压入栈 num = num / base; } push(s, num);//将最后的商压入栈 printf("转换后的结果为"); for (i = s->top; i >= 0; i--) {//将栈内元素逆序输出 printf("%d",s->a[i]); } printf("n"); free(s->a); } void menu() { printf("1.--初始化栈-----n"); printf("2.---销毁栈----n"); printf("3.----清空栈-----n"); printf("4.----栈判空------n"); printf("5.------求栈的长度----n"); printf("6.----获取栈顶元素-----n"); printf("7.----插入一个元素-----n"); printf("8.----删除一个元素-----n"); printf("9.----输出所有元素----n"); printf("10.-----进制转换----n"); printf("---退出,输入一个负数n"); } int main() { Elemtype num; stack a; a.top=-1; stack *s=&a; int choice; menu(); while (1) { printf("请选择相应的模块n"); scanf("%d", &choice); if (choice < 0) break; else { switch (choice) { case 1:a = initstack(); break; case 2:destroy(s); break; case 3:clear(s); break; case 4:isNull(s); break; case 5:length(s); break; case 6:gettop(s); break; case 7:if(!s->a) { printf("请先初始化!n"); break; } else{ printf("请输入要插入的元素n"); scanf("%d", &num); push(s, num); break; } case 8:pop(s); break; case 9:traverse(s); break; case 10:transform(); break; default:printf("请输入1~10的数n"); } } } return 0; }



