#include
#define stacksize 100//假定预分配的栈空间最多为100个元素
typedef char elementtype;//假定栈元素的数据类型为字符,在此处可以自行设置
typedef struct
{
elementtype data[stacksize];
int top;
}seqstack;
//置空栈
void initstack(seqstack*s)
{
s->top=-1;
//解释一下,s->top指向的是当前栈顶元素的位置
//当要向栈中添加一个新元素时,要先将s->top增加1,
//此时s->top指向的就是新元素要添加的位置了。
//所以当栈为空时,填加第一元素时,top加1后
//s->top的值就变为0,也就是第一个元素的位置了。
}
//判栈空
int stackempty(seqstack*s)
{
if(s->top==-1)
return 1;//若相等就返回1,否则为0
else return 0;
}
//入栈
void push(seqstack*s,elementtype x)
{
if(s->top==stacksize-1)//进栈前判断栈是否已经满了
printf(" stack overflow\n");
else
{
s->top= s->top+ 1;
s->data[s->top]=x;
}
}
//出栈
elementtype pop(seqstack*s)
{
if(stackempty(s))//出栈前先判断当前栈中是否有内容
printf("stack is empty\n");
else
{
return s->data[s->top--];//出栈后s->top的值会自减1
}
}
//取栈顶元素(只是想知道栈顶的值,并没有出栈)
elementtype gettop(seqstack*s)
{
if(stackempty(s))
{
printf("stack already empty.\n");
}
else return s->data[s->top];
}
int main()
{
elementtype x;
seqstack*s;//定义一个栈,用指针的方式定义的
initstack(s);//想初始化定义好的栈
//当栈为空时调用出栈操作
pop(s);
//向栈中添加一个元素a
push(s,'a');
//观察此时的栈顶元素
x=gettop(s);
printf("%c\n",x);
//再添加一个元素b
push(s,'b');
//观察此时的栈顶元素
x=gettop(s);
printf("%c\n",x);
//弹出栈顶的元素
x=pop(s);
printf("%c\n",x);
//观察弹出后栈顶元素的变化情况
x=gettop(s);
printf("%c\n",x);
return 0;
}
用系统栈(递归)实现转换的函数:
系统递归函数在调用时,如果输出语句是在调用语句的后面时,则输出部分是放入系统栈中的(须等到递归调用返回时,才轮到输出语句的执行)。使用递归函数的优点是程序编写简单,压栈与退栈操作由系统完成,特别适合于问题本身具有递归的特点。缺点是效率上比非递归的要差些。
#include
void dec2oct(int x)//将十进制数x转化为8进制数输出
{if(x>7)dec2oct(x/8);//如果 x不止一位8进制数,则先处理其高位部分
printf("%d",x%8);//递归返回时再输出 x的最低位
}
int main()
{int x;
scanf("%d",&x);//读入要转换的十进制数x
dec2oct(x);//将 x转换为8进制数输出
return 0;
}
/***只适合整数的表达式求值***/
/***其中部分可作修改,表达式也可是输入的***/
#include"iostream.h"
const int n0=30;
int s1[n0+1];//操作数栈
char s2[n0+1];//运算符栈
int t1,t2;
int num[4];//提取表达式中的整数
void calcu()//一次计算
{
int x1,x2,x;
char p;
//弹出一个运算符
p=s2[t2--];
//弹出两个操作数
x2=s1[t1--];
x1=s1[t1--];
//进行一次运算
switch(p){
case'+':x=x1+x2;break;
case'-':x=x1-x2;break;
case'*':x=x1*x2;break;
case'/':x=x1/x2;
}
//结果压入操作数栈
s1[++t1]=x;
}
int calculator(char*f)
{
int v,i=0;
char*p=f;
t1=t2=0;//设置空栈
while(*p!='\0')
switch(*p){
case'+': case'-':
while(t2&&(s2[t2]!='('))
//执行先遇到的加、减、乘、除运算
calcu();
//当前运算符进栈
s2[++t2]=*p;
//读下一个字符
p++;
break;
case'*': case'/':
if(t2&&(s2[t2]=='*')||(s2[t2]=='/'))
//执行先遇到的乘、除运算
calcu();
//当前运算符进栈
s2[++t2]=*p;
//读下一个字符
p++;
break;
case'(':
//左括号进栈
s2[++t2]=*p;
//读下一个字符
p++;
break;
case')':
while(s2[t2]!='(')
//执行括号内的加、减、乘、除运算
calcu();
//弹出左括号
t2--;
//读下一个字符
p++;
break;
default:
//把字符串转换成整数值
v=0;
do{
v=10*v+*p-'0';
p++;
} while((*p>='0')&&(*p<='9'));
//操作数进栈
s1[++t1]=v;
num[i++]=v;
};
//执行先遇到的加、减、乘、除运算
while(t2) calcu();
//返回结果
return s1[t1];
}
void main()
{
char a[]="5*(40+6)-39";
cout< cout<<"其中的数字为:\n"; for(int i=0;i<4;i++) { cout< } cout< } 原来做过的东西,是C++的,VC++6.0环境下调试运行成功。
上一篇:c语言开发游戏需要掌握的知识点
下一篇:c语言迷宫游戏的知识点