来自 电脑系统 2019-11-21 05:12 的文章
当前位置: 金沙澳门官网网址 > 电脑系统 > 正文

C语言中无符号与有记号难题,栈的利用

unsigned char a[5] = { 12,36,96,128,182 };

本节关键讲利用栈来完结三个前后相继中的成对现身的标志的检查实验,完结一个好像编译器的标记检查评定的效率,接受的是链式栈。

 a[]范围为0~256. 数组中数都使得。

大器晚成、难题的建议甚至消除措施

char a[5] = { 12,36,96,128,182 };

1.要是有下边风度翩翩段程序:

a[]范围为-128~127. 数组中128和182均无效。

[cpp]  

#include <stdio.h>  

#include <stdlib.h>  

  

int main ()  

{  

    int a[5][5];  

    int(*p)[5];  

      

    p = a[0];  

      

    printf ("%d", &a[3][3] - &p[3][3]);  

}   

这段程序中<>[]{}""那些标志都是成对出现的,假若不是成对现身,那么自个儿的前后相继在编写翻译的时候将会报错。

2.我们将在要编写的程序的入眼指标就是来检验程序中所现身的成对的暗号是或不是都同盟。

3.杀绝方法:

假设我们要检查实验的次第是地点的风华正茂段程序,那么大家要把每四个字符都开展围观,当程序遇见字母数字还是非成对的标识的时候一贯忽视,当程序遇见了成对现身的标识的左符号时大家将左符号压入栈。当扫描的进程中遇见右括号的时候,大家将栈顶成分弹出,实行相称,如若相配程序则持续扫描,假使相称失利,则报错。即使持有的都异常成功,那么栈为空且全体字符都围观退步。若无相称成功,那么即是相称退步只怕栈不为空。

4.算法框架

次第的算法框架如下:

 

金沙澳门官网网址 1

二、具体程序的落实

1.主次的具体得以完成注重采取链式栈的数据结构,同不日常候链式栈是经过复用单向链表来兑现的,这个在点击展开链接那篇博文中都有教书。所以算法达成的严重性部分都以在主函数中贯彻的,也便是本身所谓的上层函数。

2.首先应用在主函数中调用别的函数的点子来完毕全体程序的运作。

[cpp]  

int main()  

{  

    char *a = "#include <stdio.h> #include <stdlib.h> int main () { int a[5][5]; int(*p)[5]; p = a[0]; printf ("%d", &a[3][3] - &p[3][3]); } ";  

    scan(a);  

    return 0;  

}  

概念的是多少个字符串数组,将字符串数组的首地址传递给scan,这里一向说字符串数组只怕不太符合,关于字符和字符串的主题材料自己始终未曾搞精通,拖到了前几日。

3.scan函数接部分

(1卡塔尔国scan函数选择的是字符串数组的指针

[cpp] 

int scan (char *a)   

(2卡塔 尔(阿拉伯语:قطر‎调用链式栈的函数实行建栈的操作,再次来到的是栈指针(因为从此以后只要涉及到栈的操作都要使用到栈指针卡塔尔国

[cpp]  

LinkStack * stack = LinkStack_Create();  

(3卡塔 尔(阿拉伯语:قطر‎因为程序的算法中早就表明,大家要不停的扫描全部的字符,直到一切字符串截至,字符串停止的标记是'',这里运用while循环来实现

[cpp] 

while (a[i] != '')  

这里经过传递进入的字符串数组的首地址,我们可以透过那些首地点来定义叁个字符数组,然后开展操作。

(4卡塔 尔(英语:State of Qatar)首先决断数组中的元素是不是为成对相称的标识的左符号,要是是左符号,那么将左符号压进栈。

[cpp] 

if (left(a[i]) == 1)  

       {  

    LinkStack_Push(stack, (void*)(a + i));  

       }  

在将左符号压进栈的操作中,大家压进栈的是数组成分的地址,这里也是链式栈的可复用性的多少个呈现。

(5卡塔 尔(阿拉伯语:قطر‎接下去剖断数组中的成分是不是为成对相配的标记的右符号,假诺是右符号,那么将栈顶成分弹出,并和呼应的右符号举行比较。假如栈顶成分为空也许比较退步,那么将展开报错。

[cpp] 

if (right(a[i]) == 1)  

{  

    char* bijiao = (char*)LinkStack_Pop(stack);  

    if ((bijiao == NULL) || !match(*bijiao, a[i]))  

    {  

        printf ("%cn", a[i]);  

        ret = 0;  

        break;   

    }  

}  

(6卡塔 尔(英语:State of Qatar)最终,成功的姣好了检查实验的法则是:栈顶为空且已经济检察测到了最终二个截至符。

[cpp]  

金沙澳门官网网址 ,if (LinkStack_Top(stack) == NULL && a[i] == '')  

    {  

        printf ("编写翻译成功n");  

    }  

(7卡塔尔国程序推行的历程中还应该有别的多少个子函数

1)检查实验是否为左符号的函数2)检查实验是或不是为右符号的函数3)举办比较的函数

三、具体代码

1.程序完结所复用的链式栈的详尽代码请看点击打开链接和点击张开链接部分,这里粘的是主函数的贯彻部分。由于是新手,所以也可以有的代码部分写的不会细小糙,望大家见谅。

2.主函数的落到实处部分代码:

[cpp]  

#include <stdio.h>  

#include <stdlib.h>  

#include "1.h"  

  

/******************************************************************************* 

*函数名:left 

*参数:char a 传进来的数组成分  

*重回值:int类型 假若是左边手符号,那么再次回到1,不是再次回到0 

*功效:判别传进来的字符是或不是是左边字符  

*******************************************************************************/  

int left (char a)  

{  

    int ret = 0;  

    switch(a)  

    {  

        case '<':  

            ret = 1;  

            break;  

        case '(':  

            ret = 1;  

            break;  

        case '[':  

            ret = 1;  

            break;  

        case '{':  

            ret = 1;  

            break;  

        case ''':  

            ret = 1;  

            break;  

        case '"':  

            ret = 1;  

            break;  

        default:  

            ret = 0;  

            break;  

    }  

    return ret;  

}  

  

本文由金沙澳门官网网址发布于电脑系统,转载请注明出处:C语言中无符号与有记号难题,栈的利用

关键词: