【数据结构】之堆栈与用栈实现十进制到二进制的转换

1、可以使用栈来实现,将一个十进制的数转化为二进制的数

#include<stdio.h>
#include<stack>
using namespace std;
int convert(int n){
	int i, result = 0;
	stack<int> res;
	while(n != 0){	
		res.push(n % 2);
		n /= 2;
	}
	//弹出相应的元素
	while(!res.empty()){
		printf("%d", res.top());
		res.pop();	
	} 
} 
int main(void){
	int n; 
	printf("请输入一个十进制的数:"); 
	scanf("%d", &n);
	convert(n);
	return 0;
}

2:后缀表达式

中缀表达式:运算符号位于两个运算数之间。如,a + b * c - d / e
后缀表达式:运算符号位于两个运算数之后。如,a b c *+d e /-

当遇到运算符时把最近的两个运算数放进去运算

3:定义及操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

n个数据元素依次入栈,出栈顺序:C(2n,n)-C(2n,n+1)
n个字符入栈全排列有n!种排列方式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

typedef  struct SNode *PtrToSNode;
struct  SNode {
	ElementType  *Data;   /* 存储元素的数组 */
	int  Top;        /* 栈顶指针的位置*/
       int Maxsize;     /* 堆栈最大容量 */
};
typedef  PtrToSNode  Stack;

操作:
1:(1)生成空堆栈

Stack CreateStack(int Maxsize)
{
    Stack S = (Stack)malloc(sizeof(struct SNode));
    S->Data = (ElementType *)malloc(Maxsize * sizeof(ElementType));
    S->Top = -1;
    S->Maxsize = Maxsize;
    return S;
}

2:(2)入栈

bool IsFull( Stack S )
{   
    return (S->Top == S->MaxSize-1);
}

bool Push( Stack S, ElementType X )
{  
   if ( IsFull(S) ) {
        printf("堆栈满");  
        return false;
    }
    else {
        S->Data[++(S->Top)] = X;
        return true;
    }
}

3:(3)出栈

bool IsEmpty( Stack S )
{ 
   return (S->Top == -1);
}
ElementType Pop( Stack S )
{   if ( IsEmpty(S) ) {
        printf("堆栈空");
        return ERROR; /* ERROR是ElementType的特殊值,标志错误 */
    }
    else    
        return ( S->Data[(S->Top)--] );
}

例:

请用一个数组实现两个堆栈,要求最大地利用数组空间,使数组只要有空间入栈操作就可以成功。写出相应的入栈和出栈操作函数。
【分析】 一种比较聪明的方法是使这两个栈分别从数组的两头开始向中间生长;当两个栈的栈顶指针相遇时,表示两个栈都满了。此时,最大化地利用了数组空间

typedef  int Position;
typedef  struct  SNode *PtrToSNode;
struct  SNode {
	ElementType  *Data;   /* 存储元素的数组 */
	Position  Top1;              /* 堆栈1的栈顶指针 */
	Position  Top2;              /* 堆栈2的栈顶指针 */ 
                int  MaxSize;                 /* 堆栈最大容量 */
};
typedef  PtrToSNode  Stack;
S->Top1 =  -1; 
S->Top2 = MaxSize;
bool Push( Stack S, ElementType X, int Tag )
{   /* Tag作为区分两个堆栈的标志,取值为1和2 */
    if ( S->Top2-S->Top1 == 1) { /* 堆栈满 */
	printf("堆栈满\n");    return false;
    }
    else {
	if ( Tag == 1 )   S->Data[++(S->Top1)] = X;
	else              S->Data[--(S->Top2)] = X;
	return true;
    }
}
ElementType Pop( Stack S, int Tag )
{   /* Tag作为区分两个堆栈的标志,取值为1和2 */
    if ( Tag == 1 ) { /* 对第一个堆栈操作 */
	if ( S->Top1 == -1 ) { /* 堆栈1空 */
		printf("堆栈1空\n");   return ERROR;
	}
	else return S->Data[(S->Top1)--];
    }
    else { /* 对第二个堆栈操作 */
	if ( S->Top2 == S->MaxSize ) { /* 堆栈2空 */
		printf("堆栈2空\n");    return ERROR;
	}
	else  return S->Data[(S->Top2)++];
    }
}

在这里插入图片描述
(1) 堆栈初始化(建立空栈)
(2) 判断堆栈S是否为空

Stack CreateStack( ) 
{ /* 构建一个堆栈的头结点,返回该结点指针 */
  Stack S;
  S = malloc(sizeof(struct SNode));
  S->Next = NULL;
  return S;
}

bool IsEmpty ( Stack S )
{ /* 判断堆栈S是否为空,若是返回true;否则返回false */
  return ( S->Next == NULL );
}
bool Push( Stack S, ElementType X )
{ /* 将元素X压入堆栈S */
	PtrToSNode TmpCell;
	TmpCell = (PtrToSNode)malloc(sizeof(struct SNode));
	TmpCell->Data = X;
	TmpCell->Next = S->Next;
	S->Next = TmpCell;
	return true;
}

ElementType Pop( Stack S )  
{ /* 删除并返回堆栈S的栈顶元素 */
	PtrToSNode FirstCell;
	ElementType TopElem;
	if( IsEmpty(S) ) {
		printf("堆栈空");   return ERROR;
	}
	else {
		FirstCell = S->Next; 
		TopElem = FirstCell->Data;
		S->Next = FirstCell->Next;
		free(FirstCell);
		return TopElem;
	}
}
  • 3
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Recently 祝祝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值