妙趣横生的算法--栈和队列

时间:2021-03-26 17:38:35

栈                                                                      

栈的特点是先进后出,一张图简单介绍一下。妙趣横生的算法--栈和队列

#include "stdio.h"
#include
"math.h"
#include
"stdlib.h"
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10

typedef
char ElemType;
typedef
struct{
ElemType
*base;
ElemType
*top;
int stacksize;
}sqStack;

void initStack(sqStack *s)
{
/*内存中开辟一段连续空间作为栈空间,首地址赋值给s->base*/
s
->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if(!s->base) exit(0); /*分配空间失败*/
s
->top = s->base; /*最开始,栈顶就是栈底*/
s
->stacksize = STACK_INIT_SIZE; /*最大容量为STACK_INIT_SIZE */
}
void Push(sqStack *s, ElemType e){
if(s->top - s->base >= s->stacksize){
/*栈满,追加空间*/
s
->base = (ElemType *)realloc(s->base, (s->stacksize +
STACKINCREMENT)
*sizeof(ElemType));
if(!s->base) exit(0); /*存储分配失败*/
s
->top = s->base + s->stacksize;
s
->stacksize = s->stacksize + STACKINCREMENT; /*设置栈的最大容量*/
}
*(s->top) = e; /*放入数据*/
s
->top++;
}

void Pop(sqStack *s , ElemType *e){
if(s->top == s->base) return;//栈里面没有元素了则返回
*e = *--(s->top); //删除栈顶的元素
}

int StackLen(sqStack s){
return (s.top - s.base) ;//计算栈的长度
}
void main()
{
ElemType c;
sqStack s;
int len , i , sum = 0;
printf(
"Please input a Binary digit\n");

initStack(
&s); /*创建一个栈,用来存放二进制字符串*/
/*输入0/1字符表示的二进制数,以#结束*/
scanf(
"%c",&c);
while(c!='#')//遇到#则结束
{
Push(
&s,c);//输入一个压入一个
scanf(
"%c",&c);
}
len
= StackLen(s); /*得到栈中的元素个数,即二进制数的长度*/

for(i=0;i<len;i++){
Pop(
&s,&c);
sum
= (int)(sum + (c-48) * pow(2,i)); /*转换为十进制*/
        //二进制转十进制的算法 
}
printf(
"Decimal is %d\n",sum);
}

队列                                                                  

队列的特点是先进先出,就跟我们平常排队一个意思。妙趣横生的算法--栈和队列

#include "stdio.h"
#include
"stdlib.h"
typedef
char ElemType;
typedef
struct QNode{
ElemType data;
struct QNode *next;
} QNode ,
*QueuePtr;
typedef
struct{
QueuePtr front;
//队头指针
QueuePtr rear; //队尾指针
}LinkQueue;

void initQueue(LinkQueue *q){
/*初始化一个空队列*/
q
->front = q->rear = (QueuePtr)malloc(sizeof(QNode)); /*创建一个头结点,队头队尾指针 指向该结点*/
if( !q->front) exit(0); /*创建头结点失败*/
q
->front->next = NULL; /*头结点指针域置NULL*/
}

void EnQueue(LinkQueue *q, ElemType e){
QueuePtr p;
p
= (QueuePtr)malloc(sizeof(QNode)); /*创建一个队列元素结点*/
if( !q->front) exit(0); /*创建头结点失败*/
p
->data = e;//元素节点写入数据
p
->next = NULL;//元素节点的向后的指针指向空
q
->rear ->next = p;//将队列中的队尾指针指向刚生成的元素节点
q
->rear = p;
}
void DeQueue(LinkQueue *q, ElemType *e){
/*如果队列q不为空,删除q的队头元素,用e返回其值*/
QueuePtr p;
if(q->front == q->rear) return; /*队列为空,返回*/
p
= q->front->next;//队头给p
*e = p->data;//取出来的队头的数据
q
->front->next = p->next;//取出来的队头的下一个指向给新的队头的指向
if(q->rear == p) q->rear = q->front; /*如果队头就是队尾,则修改队尾指针*/
free(p);
}
/*测试函数*/
void main()
{
ElemType e;
LinkQueue q;
initQueue(
&q); /*初始化一个队列q*/
printf(
"Please input a string into a queue\n");
scanf(
"%c",&e);
while(e!='@'){
EnQueue(
&q,e); /*向队列中输入字符串,以@表示结束*/
scanf(
"%c",&e);
}
printf(
"The string into the queue is\n");
while(q.front != q.rear){ /*将队列中的元素出队列,并打印在屏幕上*/
DeQueue(
&q,&e);
printf(
"%c",e);
}
printf(
"\n");
}

 

 

 

转载请注明出处:http://www.cnblogs.com/yydcdut/p/3667093.html