298 lines
5.4 KiB
C
298 lines
5.4 KiB
C
#include<stdio.h>
|
|
#include<stdlib.h>
|
|
#include<conio.h>
|
|
#include<string.h>
|
|
#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; i<L.top+1; i++){
|
|
printf("第 %d 个元素的值为:%d\n", i+1, L.data[i]);
|
|
}
|
|
printf("\n\n");
|
|
}
|
|
int InsertStack(SqStack *L, int i, DataType e){
|
|
if(L->top == MAX-1){
|
|
return 0;
|
|
} else {
|
|
// 验证位置
|
|
if(i>L->top+1 || i<0){
|
|
return 0;
|
|
}
|
|
// 将 i 及其以后的元素向后移动 1 个单位
|
|
for(int j=L->top+1; j<i-1; j--){
|
|
L->data[j] = L->data[j-1];
|
|
}
|
|
// 插入
|
|
L->data[i-1]=e;
|
|
L->top++;
|
|
return 1;
|
|
}
|
|
}
|
|
int DeleteListData(SqStack *L, DataType e){
|
|
for(int i=0; i<L->top+1; i++){
|
|
if(L->data[i]==e){
|
|
// 将 i 以后的元素向前移动 1 个单位
|
|
for(int j=i; j<L->top+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; j<L->top+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<n;i++){
|
|
printf("请输入第 %d 个元素:",i+1);
|
|
scanf("%d",&e);
|
|
Push(&L1,e);
|
|
}
|
|
OutputStack(L1);
|
|
break;
|
|
case 2:
|
|
n=Pop(&L1,&e);
|
|
if(n>-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;
|
|
}
|