#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
typedef int Elemtype;
typedef struct LinkList {
Elemtype data;
struct LinkList* next;
}LN,*L;
typedef struct Stk {
int X;
L head;
int length;
}SN,*Stack;
Stack getStack(int X = 10) {
Stack s = new SN;
s->head = new LN;
s->X = X;
s->length = 0;
s->head->next = NULL;
return s;
}
void addStack(Stack stack,Elemtype data) {
L NewNode = new LN;
NewNode->data = data;
NewNode->next = stack->head->next;
stack->head->next = NewNode;
stack->length++;
}
Stack scanfStack(int X = 10) {
Stack stack = getStack();
stack->X = X;
char ch;
while ((ch = getchar()) != '\n') {
if (ch <= '9' && ch >= '0')
addStack(stack, ch - '0');
else if (ch <= 'z' && ch >= 'a')
addStack(stack, ch - 'a' + 10);
else
addStack(stack, ch - 'A' + 10);
}
return stack;
}
Elemtype popStack(Stack stack) {
if (!stack || !stack->head || !stack->head->next) {
printf("栈目前无法进行出栈操作\n");
return -1;
}
Elemtype data = stack->head->next->data;
L delNode = stack->head->next;
stack->head->next = stack->head->next->next;
stack->length--;
delete delNode;
delNode = nullptr;
return data;
}
Elemtype headStack(Stack stack) {
if (!stack || !stack->head || !stack->head->next) {
printf("当前栈无法进行读栈操作\n");
return -1;
}
return stack->head->next->data;
}
void showStack(Stack stack) {
if (stack) {
L hptr = stack->head;
printf("\n _____ \n");
while (hptr && hptr->next) {
printf(" | %d |\n", hptr->next->data);
hptr = hptr->next;
}
printf(" | | \n");
printf("-------\n");
}
}
void showValue(Stack stack) {
if (stack) {
L hptr = stack->head;
while (hptr && hptr->next) {
if (hptr->next->data >= 0 && hptr->next->data < 10)
printf("%d", hptr->next->data);
else
printf("%c", 'a' + hptr->next->data - 10);
hptr = hptr->next;
}
printf("\n");
}
}
Stack toNumX(Stack stack,int X) {
if (stack && stack->head && stack->head->next) {
int value = 0;
Stack newStack=getStack();
L hptr = stack->head;
int number = 0;
while (hptr && hptr->next) {
number++;
value += hptr->next->data*(int)(pow(stack->X,number-1));
hptr = hptr->next;
}
while (value != 0) {
addStack(newStack, value % X);
value /= X;
}
return newStack;
}
}
int main(void) {
int x;
printf("创建一个栈:\n");
printf("希望的进制:\n");
scanf("%d", &x);
printf("输入栈:\n");
getchar();
Stack s = scanfStack(x);
printf("栈成功创建如下:\n");
showStack(s);
printf("希望转换为?进制:\n");
scanf("%d", &x);
Stack s1 = toNumX(s, x);
printf("栈成功转换如下:\n");
showStack(s1);
printf("打印值如下:\n");
showValue(s1);
return 0;
}
C语言实现栈 以及任意进制转换
最新推荐文章于 2024-05-17 18:31:56 发布