c指针问题
#include <stdio.h>
#include <stdlib.h>
#include "Stack.h"
//栈的顺序存储表示
Status InitStack(Sqstack *L)
{
//构造一个空栈
(*L).base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!(*L).base) exit(ERROR);
(*L).top = (*L).base;
(*L).stacksize = STACK_INIT_SIZE;
return OK;
}//InitStack
//销毁栈
Status DestroyStack(Sqstack *L)
{
if((*L).top == (*L).base) return ERROR;
free((*L).base);
/*
调用malloc函数时,系统会自动记住该空间的起始地址及大小,
释放free时只需要将起始空间告诉系统
*/
(*L).base = NULL;
return 0;
}
//清空栈
Status ClearStack(Sqstack *L)
{
(*L).top = (*L).base;
return 0;
}
//判断栈是否为空
Status IsEmpty(Sqstack *L)
{
if((*L).top == (*L).base)
return TRUE;
else
return FALSE;
}
//返回栈的长度
Status StackLength(Sqstack *L)
{
if((*L).top != (*L).base)
return (*L).top - (*L).base;
}
//用e返回栈顶元素
Status GetTop(Sqstack *L,SElemType *e)
{
if((*L).top != (*L).base)
*e = *((*L).top - 1);
return 0;
}
//插入元素为e的新元素
Status Push(Sqstack *L,SElemType e)
{
if((*L).top - (*L).base >= (*L).stacksize)
{
(*L).base = (int *)realloc((*L).base, ((*L).stacksize + STACKINCREMENT) * sizeof(int));
if(!(*L).base)
return ERROR;
(*L).stacksize += STACKINCREMENT;
}
*((*L).top) = e;
(*L).top++;
return 0;
}
//
Status Pop(Sqstack *L,SElemType *e)
{
if((*L).top == (*L).base)
return ERROR;
*e = *(--(*L).top);
return OK;
}
//遍历栈中的元素
Status StackTravers(Sqstack *L,void(* vi)(SElemType))
{
if((*L).top == (*L).base)
return ERROR;
while((*L).top > (*L).base)
{
vi(*(*L).base);
(*L).base++;
}
return 0;
}
//算法3.1数制转换
void conversion()
{
Sqstack s;
int mod,n,e;
InitStack(&s);//初始化栈
scanf("%d",&n);//等待用户输入
//printf("%d",n);
while(n)//进行8进制的转换
{
mod = n % 8;
n = n/ 8;
Push(&s,mod);
}
while(!IsEmpty(&s))//输出结果
{
Pop(&s,&e);
printf("%d\n",e);
}
printf("\n");
}
//算法3.2.2括号匹配检验
Status check()
{
Sqstack s;
char ch[80],*p,e,g;
if(InitStack(&s))//初始化栈成功
{
printf("请输入一个表达式:\n");
gets(ch);
p = ch;
while(*p)//没有到串尾
switch(*p)
{
case '(':
case '[':
Push(&s,*p++);
break;//左括号入栈,且p++
case ')':
case ']':
printf("%c\n",*p);
printf("1\n");
if(!IsEmpty(&s))//栈不空
{
Pop(&s,&e);//弹出栈顶元素
printf("%c\n",e);
printf("%c\n",*p);
if(*p== ')'&& e!='('||*p== ']'&& e!= '[')//弹出的栈顶元素与括号不匹配,此处判别式有问题
{
printf("左右括号不匹配\n");
exit(ERROR);
}
else
{
p++;
break;
}
} else
{
printf("缺乏左括号\n");
exit(ERROR);
}
default: p++;//其他字符不处理,指针后移
}
}
if(IsEmpty(&s))//字符串结束时栈空
printf("括号匹配\n");
else
printf("右括号不匹配\n");
}
int main()
{
check();
return 0;
}
在控制台输入字符'(]',程序显示‘括号匹配’.在进行调试的时候发现当*p = ']'时,程序会进入case ']'后的语句,这时*p依然是']',但是经过Pop(&s,&e);后,*p就变为空,*p = '';无法进入if的条件判断,请问这是为什么?
...全文
相关推荐
关于C语言指针赋值的问题详解
本篇文章是对C语言指针赋值的问题进行了详细的分析介绍,需要的朋友参考下
c/c++中的指针的应用及注意问题
写本文的目的在于让大家对指针有更深一层的了解,提高指 针的应用能力,内容大都是我在实际编程中遇到的问题。相信能给大家一定的帮助。
c指针问题讨论c指针问题讨论
c指针问题讨论c指针问题讨论
再再论指针 深入解析c语言指针问题
指针是C语言规范里面一项核心内容,指针具有与生俱来的优势,利用指针可以写出许多短小精悍、效率极高的代码,它是C语言一把无可替代的利器,凭着这把利器,C语言与其它高级语言相比至少在效率方面高人一筹。但是,由于指针的原理与使用方式跟人们通常的思维习惯有较大的差别,造成了指针比C语言其它概念难理解得多,这使得对指针认识不足成为了一种在C程序员中普遍存在的现象,这种不足必然导致程序员在指针的使用过程中不断遭受挫折,挫折多了,指针俨然变成一道无法逾越的难关,恐惧感也就油然而生了。在恐惧感面前,某些程序员甚至产生了要避免使用指针的念头,这是非常不可取的。指针是如此犀利,正是它才使得C语言威猛无比,如果就这样把它放弃了,那么C语言就算是白学了。我们应当让指针成为你手中那把砍掉索伦手指上魔戒的举世无双的纳西尔圣剑,而不是成为你心中永远的魔戒。
有关C语言指针问题的详解
本文针对C语言指针问题进行了详细的解析,感性趣的朋友可以看看。


