#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<cstdlib> using namespace std; #define LL long long #define M(a,b) memset(a,b,sizeof(a)) typedef struct { int *base;///栈底 int *top;///栈顶 int stacksize; } Sqstack; int Initsatck( Sqstack &S) ///建立空栈 { S.base = (int *)malloc(100*sizeof(int)); ///申请空间 if(!S.base)///申请空间失败 { return -1; } S.top = S.base; S.stacksize = 100;///栈的初始大小为100 return 1; } int Destroystack(Sqstack &S)///销毁栈 { S.top = NULL; S.stacksize = 0; free(S.base); return 1; } int clearstack(Sqstack &S)///请空栈 { S.top=S.base; return 1; } int Stackempty(Sqstack &S)///判断栈是否为空 { if(S.top == S.base) { return -1; } else { return 1; } } int Stacklen(Sqstack &S)///获得栈的长度 { if(S.top == S.base) { return 0; } else { return (S.top - S.base); } } int Gettop(Sqstack &S)///获得栈顶元素 { int e; if(S.top ==S.base) { return -1; } else { e=*(S.top-1); } return e; } int Push(Sqstack &S,int &e)///元素e入栈 { if(S.top - S.base >=100)///空间不足 { S.base = (int*)realloc(S.base,(S.stacksize + 10)*sizeof(int)); if(!S.base) { return -1; } S.top = S.base +100; S.stacksize +=10; } *S.top = e;///如栈操作 S.top++; return 1; } int Pop(Sqstack &S, int &e)///栈顶元素出栈,并用e返回其值 { if(S.top == S.base) { return -1; } else { S.top--; e=*S.top; return e; } } int Stacktraverse(Sqstack &S)///遍历输出该栈元素 { if(S.base == NULL) { return -1; } int *p; p = S.base; while(p<S.top) { printf("%d ",*p); p++; } printf("\n"); return 1; } int main() { int n; int num[1005]; int num2[1005]; Sqstack S; Initsatck(S); if(Stackempty(S)) { printf("此栈为空\n\n\n"); } printf("请输入栈中的元素个数\n"); while(~scanf("%d",&n)) { printf("请输入栈内元素:\n"); for(int i=0; i<n; i++) { scanf("%d",&num[i]); Push(S,num[i]); } int del,e2; printf("请输入想插入的元素的值以及位置\n"); scanf("%d %d",&del,&e2); for(int i=0; i<n-del+1; i++) { num2[i]=Pop(S,num2[i]); } Push(S,e2); Stacktraverse(S); for(int i=n-del; i>=0; i--) { Push(S,num2[i]); } printf("插入后栈内的元素为\n"); Stacktraverse(S); printf("请输入删除元素的位置:\n"); int del2; scanf("%d",del2); M(num2,0); for(int i=0; i<n-del+2; i++) { num2[i]=Pop(S,num2[i]); } printf("所删除的元素是:"); printf("%d\n",num2[n-del-1]); for(int i=n-del; i>=0; i--) { Push(S,num2[i]); } printf("删除该元素后栈里元素为:\n"); Stacktraverse(S); } return 0; }
运行图 :