1.顺序栈
课件上的是用指针表示,typedef,define,但是一般结题时候用数组表示更简便,且这种方法具体使用顺序栈是pop,push不一定要写成函数,直接用两句--或者++解决还好点,这里为了练习和程序的可读性还是写了。
#include <stdio.h> #include <stdlib.h> #define Max 1024 typedef int ElemType; typedef struct { ElemType data[Max]; int top; }Stack; //初始化 int s[1000]; int topp=0; void push() { //入栈 int pushs; printf("请输入数据:"); scanf("%d",&pushs); s[topp]=pushs; topp++; } void pop() { //出栈 int pops; topp--; pops=s[topp]; printf("%d\n",pops); } int isEmpty() { //判空 if(topp==0) return 1; else return 0; } void gettop() { //取栈顶元素 int up; up=s[topp-1]; printf("%d\n",up); } void travers() { int i; //if(!isEmpty()) for(i=0;i<topp;i++) printf("%d ",s[i]); } int main() { if(isEmpty()) { printf("空\n"); } push(); push(); push(); travers(); gettop(); pop(); travers(); return 0; }
2.链栈
栈也可以说是一种线性表,只不过操作只能在栈顶,根据链式的线性表建立有头插法和尾接法,所以建立链栈也可以用这两种方法。头插法,每次新来的元素放在第一位,所以要有头指针(头指针=top指针);尾接法,每次新来的元素放在第一位,所以要有尾指针(尾指针=top指针),BUT尾接法出栈时指针不好往回播,所以还是用头插法吧。
conversion to non-scalar type requested|;
错误原因,Stack,*StackLink;结构体定义时忘记加*。
#include <stdio.h> #include <stdlib.h> #define Max 1024 typedef int ElemType; typedef struct Stack { ElemType data; struct Stack * next; }Stack,*StackLink; StackLink intiStack() { StackLink S; S=(StackLink)malloc(sizeof(Stack)); S->next=NULL; return S; } int isEmpty(StackLink S) { if(!S->next) return 1; else return 0; } void push(StackLink S) { StackLink top; top=(StackLink)malloc(sizeof(Stack)); printf("请输入需要入栈的数据:"); scanf("%d",&(top->data)); top->next=S->next; S->next=top; //printf("%d ",S->next->data); } int pop(StackLink S) { int topdata; StackLink top,p; top=S->next; if(isEmpty(S)) { printf("栈空无法弹出数据\n"); return 0; } topdata=top->data; p=top; S->next=top->next; free(p); return topdata; } void traves(StackLink S) { //printf("aaaa"); StackLink top; top=S->next; while(top!=NULL) { printf("%d ",top->data); top=top->next; } printf("\n"); } int main() { StackLink S,top; S=intiStack(); if(isEmpty(S)) { printf("空\n"); } push(S); push(S); push(S); traves(S); pop(S); traves(S); return 0; }
简单的遍历一直不对,玩了会儿手机,运行可以了,什么鬼
应用1:回文的判断
#include <stdio.h> #include <stdlib.h> int main() { int i,j; char a[100],S[100],*p; gets(a); p=a; i=0; //字符串入栈 while(*p!='\0') { S[i]=*p; i++; p++; } p=a; i--; while(i>=0) { if(*p!=S[i]) break; i--; p++; } if(i==-1) printf("是回文\n"); else printf("不是回文\n"); return 0; }
应用2:进制转换:
10进制---->其他进制是容易写的,余数压栈,再整除,最后一个一个出栈就行
其他进制---->10进制,首先将数字转化为字符串,然后单个字符入栈,再把单个字符出栈转化为数字应用次方加的公式
这里用到itoa(a,b,c)函数;先介绍一下这个函数,itoa()函数有3个参数:a是要转换的数字,b是要写入转换结果的目标字符串,c是转移数字时所用的基数,神奇的事情是,只要将c改为任何整数,就可以实现将10进制转换为任意进制,负数不行。