精华内容
下载资源
问答
  • 双堆栈-用C语言描述

    2021-01-20 21:49:51
    双堆栈的结构只比标准堆栈多了一个栈顶指针 -使两个栈分别从数组的两头开始向中间生长;当两个栈的栈顶指针相遇时,表示两个栈都满了。 -此时,最大化地利用了空间 */ typedef int Position; typedef int Element...
    #include<stdio.h>
    #include<malloc.h>
    
    /*双堆栈
    双堆栈的结构只比标准堆栈多了一个栈顶指针
    -使两个栈分别从数组的两头开始向中间生长;当两个栈的栈顶指针相遇时,表示两个栈都满了。
    -此时,最大化地利用了空间
    */
    
    typedef int Position;
    typedef int ElementType;
    typedef struct SNode * PtrToSNode;
    struct SNode
    {
    	ElementType *Data; /*存储元素的数组*/
    	Position Top1;     /*堆栈1的栈顶指针*/
    	Position Top2;     /*堆栈2的栈顶指针*/
    	int MaxSize;	   /*堆栈的最大容量*/
    };
    
    ElementType ERROR = -1;
    
    typedef PtrToSNode Stack;
    
    Stack CreateStack(int MaxSize) {
    	/*初始化
    	Top1 = -1
    	Top2 = MaxSize
    	*/
    	Stack S = (Stack)malloc(sizeof(struct SNode));
    	S->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
    	S->Top1 = -1;
    	S->Top2 = MaxSize;
    	S->MaxSize = MaxSize;
    	return S;
    }
    
    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)++];
    		}
    	}
    
    
    
    void DoubleStackDemo() {
    	printf("=============初始化双堆栈==========\n");
    	Stack S = CreateStack(10);
    	printf("\n==========分别向堆栈两端添加1-5===========\n");
    	for (int choice = 1; choice <= 2;choice++)
    		for (int i = 1;i <= 5;i++)
    			Push(S, i, choice);
    	printf("\n**********分别尝试在两端添加6***********\n");
    	Push(S, 6, 1);
    	Push(S, 6, 2);
    	printf("\n==============分别从堆栈两端取元素1-5================\n");
    	for (int choice = 1; choice <= 2;choice++)
    		for (int i = 1;i <= 5;i++) {
    			ElementType x = Pop(S, choice);
    			printf("Tag=%d\tElement=%d\n", choice, x);
    		}
    	printf("\n**************尝试继续取元素************************\n");
    	ElementType y = Pop(S, 1);
    	y = Pop(S, 2);
    }
    
    int main() {
    	DoubleStackDemo();
    	return 1;
    }

    运行结果:

    =============初始化双堆栈==========

    ==========分别向堆栈两端添加1-5===========

    **********分别尝试在两端添加6***********
    堆栈满
    堆栈满

    ==============分别从堆栈两端取元素1-5================
    Tag=1    Element=5
    Tag=1    Element=4
    Tag=1    Element=3
    Tag=1    Element=2
    Tag=1    Element=1
    Tag=2    Element=5
    Tag=2    Element=4
    Tag=2    Element=3
    Tag=2    Element=2
    Tag=2    Element=1

    **************尝试继续取元素************************
    堆栈1空
    堆栈2空

     

     

     

    展开全文
  • Cortex-M3双堆栈MSP和PSP

    千次阅读 2020-04-15 10:24:56
    什么是栈? 在谈M3堆栈之前我们先回忆一下数据结构中的栈。栈是一种先进后出的数据结构(类似于枪支的弹夹,先放入的子弹最后打...cortex-M3内核使用了双堆栈,即MSP和PSP,这极大的方便了OS的设计。 MSP的含义是Main...

    什么是栈?
    在谈M3堆栈之前我们先回忆一下数据结构中的栈。栈是一种先进后出的数据结构(类似于枪支的弹夹,先放入的子弹最后打出,后放入的子弹先打出)。M3内核的堆栈也不例外,也是先进后出的。
    栈的作用?
    局部变量内存的开销,函数的调用都离不开栈。

    了解了栈的概念和基本作用后我们来看M3的双堆栈
    cortex-M3内核使用了双堆栈,即MSP和PSP,这极大的方便了OS的设计。
    MSP的含义是Main_Stack_Pointer,即主栈
    PSP的含义是 Process_Stack_Pointer,即任务栈
    SP:SP是堆栈指针,指向最后一个被压入元素的地址。
    M3的压栈和弹栈过程:
    压栈:SP先自减4,然后将待压入的数据存放到SP所指的地址
    弹栈:从SP指针所指的地址读出数据,然后SP指针自增4。
    为什么压栈SP自减,弹栈SP自增呢?这是因为M3内核堆栈生长方向是向下的。为什么压栈和弹栈分别是减4加4呢?这是因为M3是32bit的内核。
    M3内核何时使用MSP何时使用PSP?
    M3双堆栈的意思是有两个堆栈,但是任何时刻只能使用其中之一。那什么时候使用MSP,什么时候使用PSP呢?也就是说SP寄存器中的值在某一时刻到底是使用MSP的值还是PSP的值?这是根据CONTROL寄存器的bit1来决定的。当CONTROL的bit1为0使用MSP(默认方式);当CONTROL的bit1为1使用PSP。
    在这里插入图片描述
    总结:CONTROL的bit1为0,SP = MSP
    CONTROL的bit1为1,SP = PSP
    M3复位后处于线程模式特权级,默认使用MSP。
    通过配置CONTROL寄存器的bit1位就可以决定SP使用MSP还是PSP。
    在裸机开发中,CONTROL的bit1始终是0,也就是说裸机开发中全程使用程MSP,并没有使用PSP。在执行后台程序(大循环程序)SP使用的是MSP,在执行前台程序(中断服务程序)SP使用的是MSP。
    在OS开发中,当运行中断服务程序的时候CONTROL的bit1是0,SP使用的是MSP;当运行线程程序的时候CONTROL的bit1是1,SP使用的是PSP。

    展开全文
  • STM32双堆栈及其在uCOS-II中的使用
  • 什么是栈? 在谈M3堆栈之前我们先回忆一下数据结构中的...cortex-M3内核使用了双堆栈,即MSP和PSP,这极大的方便了OS的设计。 MSP的含义是Main_Stack_Pointer,即主栈 PSP的含义是 Process_Stack_Pointer,即任务栈 SP:

    什么是栈?
    在谈M3堆栈之前我们先回忆一下数据结构中的栈。栈是一种先进后出的数据结构(类似于枪支的弹夹,先放入的子弹最后打出,后放入的子弹先打出)。M3内核的堆栈也不例外,也是先进后出的。
    栈的作用?
    局部变量内存的开销,函数的调用都离不开栈。

    了解了栈的概念和基本作用后我们来看M3的双堆栈
    cortex-M3内核使用了双堆栈,即MSP和PSP,这极大的方便了OS的设计。
    MSP的含义是Main_Stack_Pointer,即主栈
    PSP的含义是 Process_Stack_Pointer,即任务栈
    SP:SP是堆栈指针,指向最后一个被压入元素的地址。
    M3的压栈和弹栈过程:
    压栈:SP先自减4,然后将待压入的数据存放到SP所指的地址
    弹栈:从SP指针所指的地址读出数据,然后SP指针自增4。
    为什么压栈SP自减,弹栈SP自增呢?这是因为M3内核堆栈生长方向是向下的。为什么压栈和弹栈分别是减4加4呢?这是因为M3是32bit的内核。
    M3内核何时使用MSP何时使用PSP?
    M3双堆栈的意思是有两个堆栈,但是任何时刻只能使用其中之一。那什么时候使用MSP,什么时候使用PSP呢?也就是说SP寄存器中的值在某一时刻到底是使用MSP的值还是PSP的值?这是根据CONTROL寄存器的bit1来决定的。当CONTROL的bit1为0使用MSP(默认方式);当CONTROL的bit1为1使用PSP。
    在这里插入图片描述
    总结:CONTROL的bit1为0,SP = MSP
    CONTROL的bit1为1,SP = PSP
    M3复位后处于线程模式特权级,默认使用MSP。
    通过配置CONTROL寄存器的bit1位就可以决定SP使用MSP还是PSP。
    在裸机开发中,CONTROL的bit1始终是0,也就是说裸机开发中全程使用程MSP,并没有使用PSP。在执行后台程序(大循环程序)SP使用的是MSP,在执行前台程序(中断服务程序)SP使用的是MSP。
    在OS开发中,当运行中断服务程序的时候CONTROL的bit1是0,SP使用的是MSP;当运行线程程序的时候CONTROL的bit1是1,SP使用的是PSP。

    展开全文
  • 1367 双堆栈练习

    2011-07-25 10:50:22
    描述 注意空间哦,题目很简单,设想一个双堆栈总空间容量为100万个数据。现在我进行M次操作,可能是出栈,可能是入栈,希望得到最后2个堆栈的信息。输入 第一行包含两个整数N,M,表示堆栈空间大小为N,一共M次操作...
     描述 

    注意空间哦,题目很简单,设想一个双堆栈总空间容量为100万个数据。

    现在我进行M次操作,可能是出栈,可能是入栈,希望得到最后2个堆栈的信息。

    输入

    第一行包含两个整数N,M,表示堆栈空间大小为N,一共M次操作。

    其中N小于100万。

    以下M行每行格式为以下几种:

    LIN X 表示左边堆栈入栈一个数据X

    RIN X 表示右边堆栈入栈一个数据X

    LOUT 表示左边堆栈出栈

    ROUT 表示右边堆栈出栈

    保证数据合法

    输出

    输出为两行,分别代表左边堆栈和右边堆栈;

    第一行为左边,第二行为右边;

    输出顺序均为从栈底到栈顶输出。

    样例输入
    3 6
    LIN 1
    RIN 2
    LIN 3
    ROUT
    LOUT
    RIN 5
    样例输出
    1
    5

     

    模拟题,栈的拓展

    #include <stdio.h>
    char a[500001];
    char b[500001];
    long n,m;
    main()
    {
    	char t,tt;
    	int upset;
    	int up1,up2;
    	int i;
    	scanf("%ld %ld",&n,&m);
    	up1=up2=0;
    	while(m--)
    	{
    		getchar();
    		scanf("%c%c",&t,&tt);
    		if(t=='L'&&tt=='I')
    		{
    			scanf("%c%c",&t,&tt);
    			scanf("%d",&upset);
    			a[up1++]=upset+'0';
    
    		}
    		if(t=='L'&&tt=='O')
    		{
    			scanf("%c%c",&t,&tt);
    			up1--;
    		}
    		if(t=='R'&&tt=='I')
    		{
    			scanf("%c%c",&t,&tt);
    			scanf("%d",&upset);
    			b[up2++]=upset+'0';
    		}
    		if(t=='R'&&tt=='O')
    		{
    			scanf("%c%c",&t,&tt);
    			up2--;
    		}
    
    	}
    	for(i=0;i<up1;i++)
    		printf("%c ",a[i]);
    	printf("\n");
    	for(i=0;i<up2;i++)
    		printf("%c ",b[i]);
    	printf("\n");
    
    	
    
    	
    }


     

    展开全文
  • Cortex-M3 双堆栈指针(MSP&PSP)

    千次阅读 2019-12-27 10:02:32
    双堆栈指针(MSP&PSP)】 Cortex-M3内核中有两个堆栈指针(MSP & PSP),但任何时刻只能使用到其中一个。 复位后处于线程模式特权级,默认使用MSP。 通过SP访问到的是正在使用的那个指针,可以通过MSR/...
  • STM32 双堆栈

    2019-12-09 09:01:03
    参考文献 ... 栈指针的选择 如果当响应异常时,当前的代码正在使用 PSP,则压入 PSP,即使用线程堆栈;否则压入 MSP,使用主堆栈。 一旦进入了中断服务程序,CPU 就将...在uC/OS-II中利用的就是 LR 的位 2 来进行堆栈...
  • 数组实现双堆栈

    2018-05-13 16:12:56
    在一个数组中实现两个堆栈(20 分)本题要求在一个数组中实现两个堆栈。函数接口定义:Stack CreateStack( int MaxSize ); bool Push( Stack S, ElementType X, int Tag ); ElementType Pop( Stack S, int Tag ); ...
  • 这有助于ping通双堆栈主机的IPv4和IPv6地址,以及ping通负载平衡器系统的所有IP地址。 本质上,它是 ,到目前为止,仅用于noping ,但应该易于添加对oping支持。 所有选项和选项的参数都传递给未修改的noping -不...
  • 寄存器简介 Cortex-M 系列 CPU 的寄存器组里有 R0~R15 共 16 个通用寄存器组和若干特殊功能...R15 作为程序计数器 (Program Counter,PC),其中堆栈指针寄存器可以是主堆栈指针(MSP),也可以是进程堆栈指针(P.
  • STM32双堆栈及其在uC/OS-II中的使用

    千次阅读 2012-12-01 09:53:39
    STM32双堆栈及其在uC/OS-II中的使用 说明:里面可能有不少错误的观念,希望大家发现后及时的纠正。  首先了解一下双堆栈的知识,下面的图片来自《Cortex-M3权威指南》,有点枯燥,但还是要看的。   ...
  • MSP和PSP 的含义是Main_Stack_Pointer 和Process_Stack_Pointer,在逻辑地址上他们都是R13; 权威手册上说的很清楚PSP主要是在Handler的...Cortex-M3内核有两个堆栈指针:MSP-主堆栈指针和PSP-进程堆栈指针,在任...
  • 关于STM32双堆栈指针的问题

    千次阅读 2016-09-12 15:14:33
    R13是堆栈指针,一旦发生函数调用,用到堆栈指针,否则不可能进行函数调用, MSP全权限,PSP部分权限(用户权限): 裸机下,不考虑这些。只有用到了操作系统才考虑MSP和PSP,MSP给系统,PSP给用户 具体查看: ...
  • C#使用双堆栈创建队列

    千次阅读 2008-12-19 16:46:00
    堆栈的主要操作包括:元素入栈、元素出栈、清空堆栈、判断堆栈是否为空、获取堆栈元素个数。下面的程序代码中的函数ShowStackOperation()演示了上述介绍的堆栈五种常用操作。private void ShowStackOperation(){...
  • MSP 可以不用初始化.系统硬件自动搞定了.PSP 初始化为0,是用来区别,是不是第一次切换任务,因为第一次切换任务,无上一次任务来保存.不然,要保存上一个任务到栈.PendSV_HandlerCPSID I ; Prevent interruption during ...
  • STM32不是有双堆栈嘛,内核使用的是MSP,任务使用的PSP,现在感觉任务使用的也是MSP堆栈,郁闷啊。。。请这方面高手指点一下。。。 特别声明一下,使用Keil MDK 是可以进行MSP和PSP切换,使用IAR就不行了,压抑啊。。...
  • CC2564YFVR双模蓝牙堆栈

    2019-04-18 09:55:52
    TI双模蓝牙堆栈软件经过认证,并为TI的MSP430™和MSP432™ARM®Cortex®-M3和ARM®Cortex®-M4 MCU以及基于Linux®的MPU提供免版税。 TI的第三方可以支持其他处理器。附加软件包支持iPod®(MFi)协议。支持多个配置...
  • 数据结构之堆栈

    千次阅读 2019-03-17 11:44:35
    堆栈 @[.DataStructure] ... 双堆栈实现5. 堆栈应用:求表达式的值数据结构动图资源 1. 抽象数据结构 操作集合 解释 Stack CreateStack(int MaxSize) 初始化一个堆栈 bool IsFull(Stack S) 判断堆栈S是...
  • 如果函数中只有一个递归调用,我就能轻松理解递归。 但是,当我在同一个函数中看到两个或更多递归调用时,我真的很困惑。 例:int MaximumElement(int array[], int index, int n){int maxval1, maxval2;...
  • 例如,进入堆栈时会保存哪些寄存器,CPU是否支持硬件双堆栈(甚至更多层次的堆栈),如果支持多层堆栈,那么在进入中断前,外层堆栈保存哪些寄存器,内层堆栈保存哪些寄存器,是否会将外层堆栈指针保存在内层堆栈
  • 数据结构课程资源 包括单链表 链表 堆栈 二叉树 等程序编写。有利于学习数据结构知识 该资源为程序文件,可直接运行,调试无误。
  • 高分悬赏:Java语言如何利用堆栈将一个双向链表反序,首先给出堆栈的程序,然后可以使用上一节课的双向链表实现
  • 关键技术:PLC 堆栈 关键算法:指针   某基地在设计MES现场调度模块时,架构了一个部署在车间现场的IT PLC,作为MES与ME PLC通讯的中间介质,用于处理握手信号并缓存业务数据。 此调度模块要实现以下业务数据的...
  • 双向链表&&堆栈

    2003-02-13 09:50:00
    /*--------------双向链表&&堆栈--------------*/ function LinkList(){ var oList,oLength,oResult; this.Append = dListAppend; this.Length = dListLength; this.GetAt = dListGetAt; this.SetAt = ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,191
精华内容 476
关键字:

双堆栈