C语言数据结构 栈的基本操作问题

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#define NULL 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -1
typedef struct {
char *base;
char *top;
int stacksize;
}SqStack;
void InitStack(SqStack *S){
//构造一个空栈S
S->base=(char *)malloc(STACK_INIT_SIZE * sizeof(char));
if (!S->base) exit(OVERFLOW);//
S->stacksize=STACK_INIT_SIZE;//存储分配失败
S->top=S->base;
}//InitStack

int GetTop(SqStack S,char e){
//若栈不空,则用e返回S的栈顶元素,并返回1,否则返回0
if (S.top==S.base) return 0;
e=*(S.top-1);
return 1;
}//GetTop

int Push(SqStack *S,char e){
//插入元素e为新的栈顶元素
if (S->top-S->base>=S->stacksize){//栈满,追加存储空间
S->base=(char *) realloc(S->base,S->stacksize+STACKINCREMENT*sizeof(char));
if (!S->base) exit(OVERFLOW);//存储分配失败
S->top=S->base+S->stacksize;
S->stacksize+=STACKINCREMENT;
}
*S->top++ = e;
return 1;
}//Push

int Pop(SqStack *S,char e){
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
if (S->top==S->base) return 0;
e=*--S->top;
return 1;
}//Pop

void main(){
char c;
SqStack *S;
InitStack(S);
Push(S,'a');
Pop(S,c);
printf("%c",c);

}
运行出现

void InitStack(SqStack **S){
//构造一个空栈S
(*S)->base=(char *)malloc(STACK_INIT_SIZE * sizeof(char));
if (!(*S)->base) exit(OVERFLOW);//
(*S)->stacksize=STACK_INIT_SIZE;//存储分配失败
(*S)->top=(*S)->base;
}//InitStack

SqStack *S;
InitStack(&S);
//错误分析:因为C对于参数都是拷贝传递。
所以要给指针赋值,只能只用指针的指针。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-05-20
/*
InitStack(), 申请空间
b = a
请按任意键继续. . .
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -1

typedef struct node {
char *base;
char *top;
int stacksize;
}SqStack;

SqStack *InitStack(){
//构造一个空栈S
SqStack *S = (SqStack *)malloc(sizeof(node)); // 指针也需要存储空间
S->base = (char *)malloc(STACK_INIT_SIZE * sizeof(char));
printf("InitStack(), 申请空间\n");
if (!S->base) exit(OVERFLOW);//
S->stacksize = STACK_INIT_SIZE;//存储分配失败
S->top = S->base;
return S;
}//InitStack

int GetTop(SqStack S,char *e){
//若栈不空,则用e返回S的栈顶元素,并返回1,否则返回0
if (S.top == S.base) return 0;
*e = *(S.top - 1);
return 1;
}//GetTop

int Push(SqStack *S,char e) {
//插入元素e为新的栈顶元素
if (S->top - S->base >= S->stacksize){//栈满,追加存储空间
S->base = (char *)realloc(S->base,S->stacksize+STACKINCREMENT*sizeof(char));
if(!S->base) exit(OVERFLOW);//存储分配失败
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top++ = e;
return 1;
}//Push

int Pop(SqStack *S,char *e){
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
if (S->top == S->base) return 0;
*e = *--S->top;
return 1;
}//Pop

int main(){
char c,b;
SqStack *S = InitStack();
Push(S,'a');
Pop(S,&b);
printf("b = %c\n",b);
return 0;
}

数据结构中栈的基本操作,如InitStack(&s)中用了引用,而有的却没用引用...
简单的来说,传值不会改变变量的内容,比如StackEmpty(s)中,仅仅是对栈进行是否为空的判断,并不需要对Stack进行任何操作吧(如修改栈的大小,向栈中插入元素等)所以直接采用传值。而InitStack(&s)中,对栈进行了操作(给栈分配了内存),类似的还有PopStack(&s),PushStac(&s),都对栈操作...

求计算机C语言中“栈”的基本概念,希望各个方面都有,全一点。最好和教 ...
1、进栈(PUSH)算法 ①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②); ②置TOP=TOP+1(栈指针加1,指向进栈地址); ③S(TOP)=X,结束(X为新进栈的元素); 2、退栈(POP)算法 ①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检...

c语言版数据结构图的一些基本操作函数如下,有三个地方不了解,请各位...
(1)问题三:i=LocateVex(*G,va);j=LocateVex(*G,vb);G不是指针,是指针G所指对象,就是ALGraph类型。程序中多处使用变量G,但是不同的地方,含义不同。在void CreateGraph(ALGraph *G)里面,G是一个指针,因此,引用其所指对象,要用*G。其他情况下,ALGraph G,G不是指针。(2)第一:这...

利用栈的基本操作实现将任意一个十进制整数转化为R进制整数
\/\/思路:将十进制数(number)除以R取余,让取得的余数(number Mod R )进栈,让十进制数变为 number\/R,重复上述过程,直到number等于0为止,然后依次从栈中取出数据即为所求,直到栈为空,下面是实现的代码:include<stdio.h> include<stdlib.h> define MAX_SIZE 80 typedef struct {\/\/栈的数据...

C语言数据结构:利用两个顺序栈来实现一个列队的功能时遇到的问题
得把s1的数据出栈到一个缓冲区,然后把缓冲区中,在原来s1栈底的3挪动到s2的栈顶,然后s1的4、5依次压回栈s1,然后s1就能够空出栈顶的一个位置了,对吧?但是,这个放置s1出栈元素的缓冲区。。。也得是一个栈结构吧?否则的话,你怎么知道s1向缓冲区出栈的u元素 顺序呢?这样就不是双栈模拟...

C语言数据结构的一个基本问题
1 int read_2D_Array(int **array, int i, int j, int column)2 { \/\/i row j column ,总行数为column 3 return((*(int*)array + i*column + j));4 } 以上函数的参数第一行的int **array是函数参数这个参数说明该函数参数列表一接收的数据类型为int ** 型的变量 ...

哪位大神帮我看看这个C语言的题 那个 “栈”是什么意思啊
而取用的时候总是先取后洗好的放在最顶部的盘子,“栈”正是这样一种实际的抽象。在数据结构中也可以叫做“堆栈”,实质上是一种表头固定,只允许在表尾进行插入或删除的线性表,具体理解如图所示:所以出栈顺序应为:D,C,B,A,1,2,3,4,5 ...

链栈(C语言)
链栈:C语言实现的栈式数据结构探索今天,我们将深入探讨C语言中的链栈,一种基于链表实现的栈结构。它虽然看似与单链表相似,但操作上却有着独特的限制——只能在栈顶进行插入和删除操作。让我们先来看看链栈的核心存储结构:typedef int SElemType;typedef struct node { SElemType data; \/\/ 数据...

数据结构(C语言版)题:由一个栈的输入序列12345,设计算法,分别输出54321...
54321:1~5这5个数连续进栈后再5个数连续出栈,用2个循环就可以了 32145:1~3这3个数连续进栈后再3个数连续出栈,也可以用2个循环,然后是4进4出,5进5出

c语言版 数据结构问题
1.找到结构的头(H)和尾(R)2.下面是伪代码 while(H在R之前) do begin if data_at[H]!=data_at[R] then return false;\/\/肯定不对称 H<-后继;R<-前驱;end;return true;时间复杂度O(strlen(s))既为表长

相似回答