1.栈的定义、
堆栈又名栈(stack),它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
2.代码详解
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define beginsize 20
#define addsize 10
typedef char elemtype;
typedef struct
{
elemtype* top;
elemtype* base;
int sizelong;
}sqstack;
void init(sqstack* s)
{
s->base = (elemtype*)malloc(beginsize * sizeof(elemtype));
if (s->base == NULL)
{
exit(0);
}
s->top = s->base;
s->sizelong = beginsize;
}
void push(sqstack* s, elemtype i)
{
if (s->top - s->base >= s->sizelong)
{
s->base = (elemtype*)realloc(s->base, (s->sizelong + addsize) * sizeof(elemtype));
if (s->base == NULL)
{
exit(0);
}
}
*(s->top) = i;
s->top++;
}
void pop(sqstack* s,elemtype* i)
{
if (s->base == s->top)
{
return;
}
(*i) = *--(s->top);
}
int getlong(sqstack* s)
{
return (s->top - s->base);
}
int main()
{
elemtype n;
sqstack s;
int sum = 0;
int len;
init(&s);
printf("输入一段二进制数,输入完成按下#\n");
scanf("%c", &n);
while (n != '#')
{
push(&s, n);
scanf("%c", &n);
}
getchar();
len = getlong(&s);
for (int i = 0; i < len; i++)
{
pop(&s, &n);
sum = sum + (n - '0') * pow(2, i);
}
printf("将二进制转化为10进制为%d\n", sum);
//
printf("输入一段二进制数,输入完成按下#\n");
sqstack s1, s2;
elemtype m;
init(&s1);
init(&s2);
scanf("%c", &m);
while (m != '#')
{
push(&s1, m);
scanf("%c", &m);
}
getchar();
len = getlong(&s1);
int p = 0;
sum = 0;
int count = 0;
for (int i = 0; i < len; i++)
{
pop(&s1, &m);
sum = sum + (m - '0') * pow(2, count);
count++;
if (count == 3 || s1.base == s1.top)
{
push(&s2, sum);
sum = 0;
count = 0;
}
}
len= getlong(&s2);
printf("将二进制转化为8进制为\n");
for (int i = 0; i < len; i++)
{
pop(&s2, &m);
printf("%d", m);
}
return 0;
}
对于十进制比较简单没什么特别需要注意的,而对于8进制来说我们要两个栈一个用来存储原来数据一个用来存储改变后的数据。