用VC实现堆栈!只要输入一串字符再打印出来就可以了

用 C++
一楼太让我失望了...
完全当我是白痴啊...虽然我连栈都不会实现,已经很白痴了

我有点无措,什么叫做堆栈?
堆栈是一种执行“后进先出”算法的数据结构。

设想有一个直径不大、一端开口一端封闭的竹筒。有若干个写有编号的小球,小球的直径比竹筒的直径略小。现在把不同编号的小球放到竹筒

里面,可以发现一种规律:先放进去的小球只能后拿出来,反之,后放进去的小球能够先拿出来。所以“先进后出”就是这种结构的特点。

堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中。有一个

地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫做“栈底”

。数据一个一个地存入,这个过程叫做“压栈”。在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆

栈指示器中的地址自动加1。读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减 1。这个过程叫做“弹出pop

”。如此就实现了后进先出的原则。

堆栈是计算机中最常用的一种数据结构,比如函数的调用在计算机中是用堆栈实现的。
堆栈可以用数组存储,也可以用以后会介绍的链表存储。
下面是一个堆栈的结构体定义,包括一个栈顶指针,一个数据项数组。栈顶指针最开始指向-1,然后存入数据时,栈顶指针加1,取出数据后,

栈顶指针减1。

#define MAX_SIZE 100
typedef int DATA_TYPE;
struct stack
{
DATA_TYPE data[MAX_SIZE];
int top;
};

用数组实现堆栈这个没什么问题吧,怎么搞得好像我做了什么对不起大家的事?如果有更透彻的讲解我洗耳恭听!

#include "stdio.h"
void main()
{
char str[81],*pTop;
pTop=str;
while((*pTop=getchar())!='\n') pTop++;/*模拟压栈*/
while(pTop!=str)
{
putchar(*pTop);
pTop--;/*模拟出栈*/
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2007-04-23
恕我愚笨
楼上的用的是栈吗??
getchar()的实现原理更象是队列
这根本就与栈没有关系
只是从后向前输出而已
完全违背了楼主的想法吧?
--没有抢分的意思,希望楼上的再给人家写一个吧
呵呵

那我还是回一个吧
堆栈是一种执行“后进先出”算法的数据结构。这个太对了
但是
从程序上看
实现栈的原理应该是计算机底层实现(而且这个实现是虚拟的)的吧?
用户无法从代码上理解栈的含义,这个就已经违背了提问的初衷
另外,如果您一定从寄存器方面考虑,那么对于你的程序来说,我认为他依然是倒序取数据
从程序角度来看,做为栈只允许栈顶的数据弹出,而您的程序我只要将pTop--改一下就可以弹出栈顶以外的数据了吧?
肯定的是,我们探讨到最后,可以说,栈只是我们想出来的,并不是物理上存在的,但是我们要在代码层构建这样一个结构,所以写的还是清晰一些比较好~~

用VC实现堆栈!只要输入一串字符再打印出来就可以了
里面,可以发现一种规律:先放进去的小球只能后拿出来,反之,后放进去的小球能够先拿出来。所以“先进后出”就是这种结构的特点。堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中。有一个 地址指针总指向最后一个压入堆栈...

C语言编程,写一个函数,使输入的一个字符串按反序存放,在主函数中输入和...
include <stdio.h> include <string.h> define N 10 \/\/可通过改变N 的值来改变输入字符串的长度 char a[30];int i;void main(){ void Reverse(); \/\/函数声明 printf("请输入字符串:");scanf("%s",&a[i]);printf("反转后的字符串:");Reverse(); \/\/函数调用 } void Rever...

求C语言编程题
1、编一程序,将字符串computer赋给一个字符数组,然后从第一个字母开始间隔的输出该串,请用指针完成。#include<stdio.h>int main(){ char string[]="computer"; char *p=string; while(*p) { printf("%c",*p); p++; p++; } getch();} 2、输入一个字符串string,然后在string里面每个字母间加一个空格...

如何用VC(也可以使用VC.NET或C#)实现金山词霸那样的取词功能?
所以Windows的所有字符输出都是由调用TextOut和ExtTextOut实现的。因此,如果你可以修改这两个函数的入口,让程序先调用你自己的一个函数再调用系统的字符输出,你就可以得到Windows所有输出的字符了。 到了Windows95时代,原理基本没变,但是95比3.x要复杂。开始的时候,一些在windows3.x下编写的取词软件仍然可以是使用。但...

什么是VB?什么是VC?它们有什么区别?
实际上,在Windows下显示“Helloworld”,最简单的方法只要5行就够了: #include“windows.h” voidWinMain() { MessageBox(NULL,”HelloWorld!”,”MyFirstWindowsApplication”,MB_OK); } 当然这个程序只建立了一个最简单的对话框,但这已经够了。 如果你没有SDK编程的经验,学VC就是要利用MFC绕过Windows编程的许多...

急求用vc6做的鼠标取词程序,谢谢好心人
, sizeof(DWORD),dwProtect,&temp); } pThunk++; } return 1;}}} 替换了输入地址表中TextOutA的入口为MyTextOutA后,截获系统函数调用的主要部分已经完成,当一个被注入进程调用TextOutA时,其实调用的是MyTextOutA,只需在MyTextOutA中显示传进来的字符串,再交给TextOutA处理即可。

哪些usb无线网卡支持frame injection
调试工具使用Softice,我使用的是2.7版本,这个工具非常强,可以看变量,内存,也可以看堆栈调用,很多棘手的问题手到擒来。或者一般也可以通过debugview工具调试,需要的程序的关键路径上打印变量即可。当程序比较稳定了,就可以使用debugview观察逻辑上的问题,这样就可以比较快的定位,然后再使用softice进行...

利用栈实现逆波兰表达式求值
我们定义了堆栈stack[MAX]后,就可以利用入栈操作存储先后输入的两个运算数。下面看一下是如何实现的:int push(int i) \/*存储运算数,入栈操作*\/{ if(top<MAX) { stack[++top]=i; \/*堆栈仍有空间,栈顶指示上移一个位置*\/ return 0; } else \/*堆栈已满,给出错误信息,返回出错指示*\/ { printf("The...

谁知道.gdb格式的文件用什么打开?
gdb中,输入命令时,可以不用打全命令,只用打命令的前几个字符就可以了,当然,命令的前几个字符应该要标志着一个唯一的命令,在Linux下,你可以敲击两次TAB键来补齐命令的全称,如果有重复的,那么gdb会把其例出来。示例一:在进入函数func时,设置一个断点。可以敲入break func,或是直接就是b func(gdb) b funcBreak...

dll为后缀名的文件是什么文件?
Extension DLL:用来实现从 MFC 所继承下来的类的重新利用,也就是说,用这种类型的动态连接库,可以用来输出一个从 MFC 所继承下来的类。它输出的函数仅可以被使用 MFC 且动态链接到 MFC 的应用程序使用。可以从 MFC 继承你所想要的、更适于你自己用的类,并把它提供给你的应用程序。你也可随意的给你的应用程序...

相似回答
大家正在搜