颠倒栈 {5,4,3,2,1}-->{1,2,3,4,5}

递归颠倒栈实现
本文介绍了一种使用递归方法颠倒栈中元素顺序的算法。通过两个递归函数,实现了栈内元素的颠倒操作。举例说明了如何将栈{1,2,3,4,5}

题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5}1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1}5处在栈顶。

只消两个递归即可,直接看代码吧!

// reverseStack2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <stack>
using namespace std;


void AddToStackButton(stack<int>&T,int top)
{
if (T.empty())
{
T.push(top);
}
int top1=T.top();
AddToStackButton(T,top);
T.push(top1);
}
void ReverseStack(stack<int> &T)
{
if (T.empty())
{
return;
}
if (T.size())
{
return ;
}
int top=T.top();
T.pop();
ReverseStack(T);
AddToStackButton(T,top);

}

int _tmain(int argc, _TCHAR* argv[])
{
stack<int>s;
s.push(5);
s.push(4);
s.push(3);
s.push(2);
s.push(1);
ReverseStack(s);
cout<<s.size()<<endl;
while(!s.empty())
{
int num=s.top();
cout<<num<<" ";
s.pop();
}

system("pause");
return 0;
}

// reverseStack2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <stack>
using namespace std;


void AddToStackButton(stack<int>&T,int top)
{
	if (T.empty())
	{
		T.push(top);
	}
	int top1=T.top();
	AddToStackButton(T,top);
	T.push(top1);
}
void ReverseStack(stack<int> &T)
{
	if (T.empty())
	{
		return;
	}
	if (T.size())
	{
		return ;
	}
	int top=T.top();
	T.pop();
	ReverseStack(T);
	AddToStackButton(T,top);

}

int _tmain(int argc, _TCHAR* argv[])
{
	stack<int>s;
	s.push(5);
	s.push(4);
	s.push(3);
	s.push(2);
	s.push(1);
	ReverseStack(s);
	cout<<s.size()<<endl;
	while(!s.empty())
	{
		int num=s.top();
		cout<<num<<" ";
		s.pop();
	}

	system("pause");
	return 0;
}


#include <stm32f4xx.h> static const int smg_value[]={0x800,0xF08,0x420,0x600,0x308,0x210,0x010,0xF00,0x000,0x200}; volatile int direction = 1; volatile int current_shuzi = 0; volatile int zhouqi_shijian = 1; void SmgInit (void)//数码管配置 { RCC->AHB1ENR |=1<<2; GPIOC->MODER = (GPIOC->MODER &~(0x00FF0FF0))|(0x00550540); GPIOC->OTYPER |=0xF38; GPIOC->OSPEEDR &=~0xFF0FC0; GPIOC->PUPDR &=~0xFF0FC0; GPIOC->ODR |=0xF38; } void BtnInit (void)//按钮配置 { RCC->AHB1ENR |=1<<2; GPIOC->MODER &=~(0x3<<26); GPIOC->PUPDR = (GPIOC->PUPDR &~(0x3<<26))|(0x1<<26); } void SmgFlash (int i)//循环显示1~9 { if (i>=0 && i<=9) { GPIOC->ODR = (GPIOC->ODR &~(0xF38))|smg_value[i]; } } void ExitInit (void)//配置PC11为输入 { RCC->AHB1ENR |=1<<2; RCC->APB2ENR |=1<<14; SYSCFG->EXTICR[3]=(SYSCFG->EXTICR[3] &~(0xF<<4))|(0x2<<4); EXTI->IMR |=1<<13; EXTI->FTSR |=1<<13; NVIC->ISER[1] |=1<<8; } void EXTI15_10_IRQHandler(void) { if (EXTI->PR & (1<<13)) direction=-direction;//按钮按下发生中断后进行反向 EXTI->PR |=1<<13; } void TimerInit (void)//配置定时器 { RCC->APB1ENR |=1<<0; TIM2->ARR=15999; TIM2->PSC=999; TIM2->CR1=1<<7; TIM2->CR1|=1<<0; TIM2->DIER |=1<<0; NVIC->ISER[0] |=1<<28; } void Timerzhouqibh (void)//周期变化 { TIM2->ARR=(16000*zhouqi_shijian)-1; TIM2->EGR |=1<<0;//再次初始化周期 } void TIM2_IRQHandler (void) { if ( TIM2->SR & 1<<0) { TIM2->SR &=~(1<<0); if (direction==1) { if (current_shuzi<9) { current_shuzi++; } else { direction=-1; } } else { if (current_shuzi>0) { current_shuzi--; } else { direction=1; } } } } void UsartInit (void)//配置USART2并使能USART2中断 { RCC->AHB1ENR |=1<<0; RCC->APB1ENR |=1<<17; GPIOA->MODER = (GPIOA->MODER &~(0xF<<4))|(0xA<<4); GPIOA->OTYPER &=~(0xF<<4); GPIOA->OSPEEDR = (GPIOA->OSPEEDR &~(0xF<<4))|(0xA<<4); GPIOA->AFR[0] = (GPIOA->AFR[0] &~(0xFF<<8))|(0x77<<8); USART2->BRR = 1667; USART2->CR1 = (1<<13)|(1<<3)|(1<<2); USART2->CR1 |=1<<5;; NVIC->ISER[1]|=1<<6; } void USART2_IRQHandler(char c) { if (USART2->SR & (1<<5))//如果现在可以读取数据 { USART2->DR=c;//将数据寄存器中的数据赋给c if (c>='1' && c<='5')//注意这里1和5要加'',因为在我们要的是'1'这个字符,而不是1这个数字 { zhouqi_shijian = c-'0'; Timerzhouqibh(); } } } int main() { SmgInit(); BtnInit(); ExitInit(); TimerInit(); UsartInit(); while(1) { SmgFlash(current_shuzi); } } 目前这段代码我遇到的问题是串口通信时我输入了数字2但是他就卡在目前数码管显示的那个数字不动了而不是周期变为两秒。
最新发布
11-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值