
1、建立能够存放十进制整数的顺序栈空栈,完成数制转换(十进制数转成二进制数、八进制数和十六进制数)。
#include#include #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OVERFLOW -1 #define ERROR -1 #define TRUE 1 #define FALSE 0 typedef struct{ int *base; int *top; int stacksize; } SqStack; void InitStack(SqStack *S){ //初始化栈 S->base = (int*)malloc( STACK_INIT_SIZE * sizeof(int) ); if( !S->base )exit(OVERFLOW); S->stacksize = STACK_INIT_SIZE; S->top = S->base; } //插入元素 e 为栈顶元素 void Push(SqStack *S, int e){ if(S->top - S->base >= S->stacksize){ S->base = (int*)realloc(S->base, (S->stacksize + STACKINCREMENT)*sizeof(int)); if( !S->base )exit(OVERFLOW); S->top = S->base + S->stacksize; S->stacksize += STACKINCREMENT; } *S->top++ = e; } //用 e 返回栈顶元素并删除之 void Pop(SqStack *S, int *e){ if(S->top == S->base)exit(ERROR); *e = *--S->top; } //若S为空栈,返回TRUE, 否则返回FALSE int StackEmpty(SqStack S){ if(S.base == S.top){ return TRUE; } else return FALSE; } //数制转换函数 void conversion(){ int n, type, flag = 0; int e; SqStack S; InitStack(&S); printf("请输入一个十进制数:n"); scanf("%d", &n); printf("请输入要转换成的进制类型(输入 2 或 8 或 16):n"); scanf("%d", &type); if(n==0 && (type==2 || type==8 || type==16)){ printf("转换后的 %d 进制数为:n0n", type); exit(0); } if(n<0){ flag = 1; n = -n; } switch (type) { case 2: while(n){ Push(&S, n % 2); n /= 2; } printf("转换后的 2 进制数为:n"); if(flag)printf("-"); while( !StackEmpty(S) ){ Pop(&S, &e); printf("%d", e); } printf("n"); break; case 8: while(n){ Push(&S, n % 8); n /= 8; } printf("转换后的 8 进制数为:n"); if(flag)printf("-"); while( !StackEmpty(S) ){ Pop(&S, &e); printf("%d", e); } printf("n"); break; case 16: while(n){ Push(&S, n % 16); n /= 16; } printf("转换后的 16 进制数为:n"); if(flag)printf("-"); while( !StackEmpty(S) ){ Pop(&S, &e); printf("%d", e); } printf("n"); break; default: printf("输入的类型有误,请检查后重新输入!n"); break; } } int main() { conversion(); return 0; }
运行结果:
2、建立能够存放字符的顺序栈空栈,利用栈的特性对输入的字符串完成是否为回文的判断。
#include#include #include #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OVERFLOW -1 #define ERROR -1 typedef struct{ char data[STACK_INIT_SIZE]; int base; int top; int stacksize; } SqStack; //栈初始化 void InitStack(SqStack *S){ for(int i=0; i data[i]=''; S->base = S->top = 0; S->stacksize = STACK_INIT_SIZE; } //插入元素 e 为栈顶元素 void Push(SqStack *S, char e){ if(S->top == STACK_INIT_SIZE - 1)exit(ERROR); S->data[S->top++] = e; } //回文字符串判断 void isPalindrome(){ int len = 0, flag = 1; SqStack S; printf("请输入字符串长度:n"); scanf("%d", &len); printf("请输入字符串:n"); getchar(); while(len--){ char temp; scanf("%c", &temp); Push(&S, temp); } for(int i=0; i 运行结果:
实验心得:
1、typedef一个变量时,不能直接在声明的同时初始化。而应该是在申明一个此类型变量时或者之后进行初始化。也可以在typedef后面声明一个实变量,用这个实变量去给以后新的此类型变量赋值初始化。
2、顺序栈的“先入后出”特点,能够为许多问题提供有效的解决方案,如括号配对、后缀表达式计算等,这种数据结构的特点和用法应该熟练掌握。
3、当不确定输入变量的数量时,可以采用动态内存分配来解决变量输入不断增加的内存不够问题,入栈的Push函数有效地体现了这一点。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)