#include #include #include #include #define MAX 100 typedef int DataType; typedef struct { DataType data[MAX]; // 元素 int top; // 栈顶指针 }SqStack; typedef struct { char data[MAX]; // 元素 int top; // 栈顶指针 }SqStackChar; void InitStack(SqStack *L){ L->top = -1; printf("\n初始化成功\n"); } int Push(SqStack *L, DataType e){ if(L->top == MAX-1){ return 0; } else { L->top++; L->data[L->top]=e; return 1; } } int Pop(SqStack *L, DataType *e){ if(L->top ==- 1){ return 0; } else { *e=L->data[L->top]; L->top--; return 1; } } int GetTop(SqStack *L, DataType *e){ if(L->top == -1){ return 0; } else { *e=L->data[L->top]; return 1; } } int StackEmpty(SqStack L){ if(L.top == -1){ return 1; } else { return 0; } } int StackFull(SqStack L){ if(L.top == MAX-1){ return 1; } else { return 0; } } void OutputStack(SqStack L){ printf("\n\n"); for(int i=0; itop == MAX-1){ return 0; } else { // 验证位置 if(i>L->top+1 || i<0){ return 0; } // 将 i 及其以后的元素向后移动 1 个单位 for(int j=L->top+1; jdata[j] = L->data[j-1]; } // 插入 L->data[i-1]=e; L->top++; return 1; } } int DeleteListData(SqStack *L, DataType e){ for(int i=0; itop+1; i++){ if(L->data[i]==e){ // 将 i 以后的元素向前移动 1 个单位 for(int j=i; jtop+1; j++){ L->data[j]=L->data[j+1]; } L->top--; return 1; } } return 0; } int DeleteListPos(SqStack *L, int i){ // 验证位置 if(i>L->top+1 || i<0){ return 0; } // 将 i-1 以后的元素向前移动 1 个单位 for(int j=i-1; jtop+1; j++){ L->data[j]=L->data[j+1]; } L->top--; return 1; } char NumToChar(int n){ if(n>=0 && n<=9){ return (char)('0'+n); } else { return (char)('A'+n-10); } } int PushChar(SqStackChar *L, char e){ if(L->top == MAX-1){ return 0; } else { L->top++; L->data[L->top]=e; return 1; } } int PopChar(SqStackChar *L, char *e){ if(L->top==-1){ return 0; } else { *e=L->data[L->top]; L->top--; return 1; } } void Base(SqStackChar *L, int n, int e){ int i; char temp; // 转换 while(e){ PushChar(L, NumToChar(e%n)); // 进栈 e=e/n; } // 输出 printf("\n转换后的数为:"); while(1){ i=PopChar(L, &temp); if(i==0){ break; } else { printf("%c",temp); } } printf("\n\n"); } void Palindrome(SqStackChar *L, int e){ int i=1,n=e; char temp,temp1; // 转换 while(n){ PushChar(L, NumToChar(n%10)); // 进栈 n/=10; } // 比较 while(e){ i=PopChar(L, &temp); if(i==0){ break; } else { temp1=NumToChar(e%10); e/=10; if(temp!=temp1){ i=0; break; } } } // 输出 if(i){ printf("此数为回文数。\n"); } else { printf("此数不为回文数。\n"); } } int main(){ SqStack L1; SqStackChar L2; int n,choice; DataType e; InitStack(&L1); // 初始化 for(;;){ printf("\t\t1.入栈\n"); printf("\t\t2.出栈\n"); printf("\t\t3.输出所有元素\n"); printf("\t\t4.读取栈顶元素\n"); printf("\t\t5.插入元素\n"); printf("\t\t6.删除指定值的元素\n"); printf("\t\t7.删除指定位置的元素\n"); printf("\t\t8.进制转换\n"); printf("\t\t9.回文数判断\n"); printf("\t\t0.退出\n"); printf("请选择:"); scanf("%d",&choice); if(choice==0) break; switch (choice) { case 1: printf("请输入需要输入的元素个数:"); scanf("%d",&n); for(int i=0;i-1){ printf("出栈元素为 %d\n",e); } else { printf("栈为空\n"); } break; case 3: OutputStack(L1); break; case 4: n=GetTop(&L1,&e); if(n>-1){ printf("栈顶元素为 %d\n",e); } else { printf("栈为空\n"); } break; case 5: if(StackFull(L1)){ printf("栈已满,无法入栈。"); } else { printf("请输入要插入的位置:"); scanf("%d",&n); printf("请输入要插入的元素:"); scanf("%d",&e); n=InsertStack(&L1,n-1,e); if(!n){ printf("插入失败,位置输入错误。\n"); } else { printf("插入成功。\n"); } } break; case 6: printf("请输入需要删除的元素的值:"); scanf("%d",&e); n=DeleteListData(&L1,e); if(n==0){ printf("删除失败,元素不存在。\n"); } else { printf("删除成功\n"); } OutputStack(L1); break; case 7: printf("请输入需要删除的元素的位置:"); scanf("%d",&n); n=DeleteListPos(&L1,n); if(n==0){ printf("删除失败,位置不存在。\n"); } else { printf("删除成功\n"); } OutputStack(L1); break; case 8: L2.top = -1; // 初始化 printf("请输入需要转换的十进制数:"); scanf("%d",&e); printf("请输入需要转换成的进制:"); scanf("%d",&n); Base(&L2,n,e); break; case 9: L2.top = -1; // 初始化 printf("请输入需要判断的回文数:"); scanf("%d",&e); Palindrome(&L2,e); break; default: break; } printf("请按任意键继续..."); getch(); system("cls"); } printf("感谢使用,再见\n"); return 0; }